powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как бороться с currency ?
4 сообщений из 4, страница 1 из 1
Как бороться с currency ?
    #32329084
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
m.Var1=$ 123456789 . 1234 
m.Var2= 3333333 
?m.Var1/m.Var2*m.Var2
Результат =  123456654 . 3210 

т.е. ошибка при вычислении уже превышает все допустимые пределы!
Я борюсь с этим так ?Val(str(m.Var1,15,4))/m.Var2*m.Var2
Может кто-то знает более красивый способ?
...
Рейтинг: 0 / 0
Как бороться с currency ?
    #32329131
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй функции конвертации

MTON() и NTOM()

======================================
При работе с данными типа Currency есть следующие отличия от типа Numeric:

1. Округления в процессе вычислений:

Currency - округляется каждая операция до 4 цифр после запятой

Numeric - каждая операция округляется с точностью до 16 значащих цифр. Результат расчета округляется до расчетного количества цифр после запятой. Расчетное количество цифр после запятой зависит от количества цифр после запятой у исходных чисел, выполняемых операций и настройки SET DECIMALS

Например, сравни:

?4/3*3
?NTOM(4)/3*3


2. Способ хранения

Currency - хранится в специальном формате и занимает всегда 8 байт
Numeric - хранится как символьная строка: одна цифра - один символ

Как следствие прямое сравнение данных типа Currency и Numeric может дать .F. несмотря на то, что казалось бы они равны, например:

?NTOM(268435456.4)=268435456.4

=======================================
Если задача предполагает большое количество расчетов с денежными данными, то лучше отказаться от хранения денег в формате Currency и хранить все в формате N(20,4). Это занимает больше места (20 байт вместо 8), но позволяет сущетсвенно упростить все вычисления.

Если это невозможно, то необходимо всегда перед выполнением расчетов конвертировать Currency в Numeric, используя функцию MTON(), поскольку все переменные памяти числового типа по умолчанию имеют тип Numeric (или Integer)
...
Рейтинг: 0 / 0
Как бороться с currency ?
    #32329241
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Currency еще плох тем невозможностью , в случае необходимости , увеличения числа хранимых знаков после запятой...А такие случаи не редки
...
Рейтинг: 0 / 0
Как бороться с currency ?
    #32330692
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимируМ, спасибо.
Умеет же, однако, MS придумать вещи, предназначенные исключительно для головной боли программистов. :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как бороться с currency ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]