Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как бороться с currency ? / 4 сообщений из 4, страница 1 из 1
19.11.2003, 16:37
    #32329084
andrew_Pr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бороться с currency ?
Код: 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
19.11.2003, 17:00
    #32329131
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бороться с currency ?
Используй функции конвертации

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
19.11.2003, 17:58
    #32329241
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бороться с currency ?
Currency еще плох тем невозможностью , в случае необходимости , увеличения числа хранимых знаков после запятой...А такие случаи не редки
...
Рейтинг: 0 / 0
20.11.2003, 18:58
    #32330692
andrew_Pr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как бороться с currency ?
ВладимируМ, спасибо.
Умеет же, однако, MS придумать вещи, предназначенные исключительно для головной боли программистов. :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как бороться с currency ? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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