|
|
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Я прочитал в Helpe VFP 8.0 про то, что прям-таки желательно в экономических расчетах использовать тип Currency, а Numeric , Double и Float лучше не использовать. Чем это вызвано? А если мне 4 знака после запятой не хватает чтож тогда делать? Очень было бы хорошо чтобы вы поделились своим мнением по данному вопросу. Весьма желательно также про "подводные камни" какие встречались при использовании данных типов данных упомянуть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2006, 15:05 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Currency Это специальный формат, для хранения "денежных" типов данных. Но прежде, чем использовать его в своей программе следует учесть ряд особенностей по работе с этим типом данных. Прежде всего, следует понимать, несмотря на то, что данный тип данных также относится к "числовым" данным (т.е. в нем хранятся числа), но это все-таки не тип данных Numeric. Как следствие, прямое сравнение данных типа Currency и Numeric может дать неожиданный результат. Например: Код: plaintext 1. 2. Первое сравнение, как и ожидалось, вернет .T., а вот второе совершенно неожиданно возвращает .F. Почему? Это знают только разработчики FoxPro. Но с практической точки зрения отсюда следует вывод, что перед сравнением разных числовых типов данных их следует приводить к одному типу данных. Причем приведение к типу Numeric требует дополнительного округления. Например: Код: plaintext 1. 2. 3. 4. 5. 6. Символ "$" говорит о том, что далее идет число типа Currency. Его использование аналогично явному преобразованию через функцию NTOM(). Как видите, первые 2 сравнения вернут .F., в то время как последние 2 - .T. Другая особенность типа данных Currency связана со способом округления результатов промежуточных вычислений. Сравните: Код: plaintext 1. 2. Откуда взялось расхождение в четвертом знаке после запятой? А это как раз следствие особенностей округления промежуточных результатов расчета. Дело в том, что как было сказано ранее, по умолчанию, все числовые переменные памяти считаются имеющие тип данных Numeric. Опять же, как было сказано ранее, FoxPro выполняет расчеты с точностью до 16 значащих цифр. Т.е. в памяти, результат деления 4/3=1.333333333333333 - до 16 значащих цифр. А результат деления $4/3=1.3333 - до 4 знаков после запятой, поскольку тип Currency больше не хранит. Теперь, когда этот промежуточный результат снова умножается на 3, получается: для типа Numeric - 3.999999999999999, а для типа Currency - 3.9999. Завершающее действие - это округление результата до некоторого фиксированного количества знаков после запятой. В данном случае, выражение типа Numeric будет округлено до 2 знаков после запятой и получится 4.00, а тип Currency округляется до 4 знаков после запятой и остается те же 3.9999 Т.е. в принципе, использовать тип Currency можно, но следует иметь в виду приведенные выше особенности его работы, чтобы получать точные результаты. Но если Ваша программа предполагает сложные денежные расчеты, то лучше использовать типа данных Numeric(18,2) вместо Currency. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2006, 15:30 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
ВладимирМ. Интересный ответ. Но все-таки из него не понятно зачем советуют использовать Currency. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2006, 16:00 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
MegabrainВладимирМ. Интересный ответ. Но все-таки из него не понятно зачем советуют использовать Currency. Кто советует-то? Буржуины, проклятые Currency - это тип данных, для "ихних" (буржуинских) денег. И, соответственно, для "ихней" же бухгалтерской системы. В нашей бухгалтерской системе, если будешь использовать тип данных Currency, ты замаешся бегать от бухгалтеров, которые будут к тебе постоянно приставать с "глупыми" вопросами по поводу округления копеек. Ну, или придется постоянно переводить во ВСЕХ операциях расчета Currency в Numeric. Сделай поиск по этому сайту по ключевому слову "Currency". Сразу поймешь, что использовать его не надо. Другая арифметика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2006, 20:15 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
ВладимирМ. Я ведь почему такой вопрос поднял. Меня уже бухгалтерия достала своими вопросами "Почему программа считает неправильно?", причем расхождение на копейки. И я их понимаю потому что из-за энтих копеек с них спрос идет. А программу ваял не я, а программист в центральном отделении нашей компании. И посему ничего сделать не могу. Теперь же я хочу создать свой вариант этой же программы. Но если у меня такая же ерунда с расчетами будет, то аргумент "программа не моя" уже не пройдет. А ошибки в той программе идут из-за ошибок округления. Правда сказать там в некоторых местах просто алгоритмы расчета не совсем правильные, но все равно хотелось бы знать побольше о типах данных, мало ли какие глюки могут всплыть. И заодно не подскажете, где можно найти енти самые правила округления при расчетах? Конечно немного не в тему, но все же. :0)X ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 09:12 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
точность расчета в FoxPro Правила округления в FoxPro стандартные. Точнее, это самый распространенный стандарт округления. <5 - округление в меньшую сторону >=5 - округлегние в большую сторону Все. Никаких дополнительных условий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 10:44 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
2Megabrain В том, что копейки где-то вылезают, виноват не тип поля , а алгоритм округления. Я у себя суммы храню только в полях типа currency и никаких проблем не испытываю. А для хранения курсов валют использую Float. Правда база у меня на MSSQL, а клиент VFP). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 10:59 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
ВладимирМ. Вы меня не так поняли. Я имел в виду округление в ЭКОНОМИЧЕСКИХ расчетах. Кстати насчет округлений, я недавно читал книгу по вычислительной математике и в частности раздел по окуруглению чисел при расчетах. Так вот правило "если цифра больше либо равна 5, то 1", там для 5 работала с учетом того какая цифра стоит после 5 четная или нечетная, ну и как это понимать ? :0)X У меня есть на сей счет мнение но хотелось бы услышать вначале ваше. SS ;0)X ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 11:29 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Я же сказал, что существует НЕСКОЛЬКО правил округления. Все зависит от конкретной задачи. Насколько я знаю, никаких "особых" правил округления для экономических расчетов не существует. Обычно результат всегда округляют до 2 знаков после запятой. Проблема возникает именно с округлением промежуточных результатов расчета. Трудность ведь не в правилах, а в том, как бухгалтера будут проверять результат. Скорее всего, они будут использовать стандартные правила округления из школьного курса, а проверять данные на калькуляторе. Если ваша программа будет работать не так, будут проблемы с бухгатлерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 11:41 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
ВладимирМ. Наверное вы правы, правила округления определяются в зависимости от задачи. Во всяком случае ничего более менее общего я не нашел. Но данный метод округления о котором я упоминал приводится в этой книге (насколько я помню), как СТАНДАРТНЫЙ метод математического округления. Насчет промежуточного округления вы правы, я встречался с программами в которых очень интересно НДС расчитывали. Брали сумму проданного товара по всем предприятиям покупателям и считали с него %18 процентов. Потом мне бухгалтер говорил (расчитав НДС по каждому предприятию отдельно и просуммировав затем НДС), "а почему цифры не идут?". :0)X Спасибо за внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 13:26 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Заодно тогда приучите своих бухгалтеров в Excel во всех формулах использовать =округл(...;2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 15:19 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
AndreTM. Бухгалтера не при чем. Это программа не правильно считает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 15:53 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
MegabrainAndreTM. Бухгалтера не при чем. Это программа не правильно считает. а в ы н е у м е е т е п и с а т ь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 16:41 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Тов. ФУУУУУУУУ (надеюсь ни одного У не пропустил?) Читайте внимательнее программа не моя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 17:18 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Маленький добавчик может я упустил конечно и это уже прозвучало. При вычислительных операциях с типом Currency используется все 19 значащих цифр, а при работе с типом numeric только 16, остальные округляются. Это бывает важно при суммировании больших чисел, например при построении отчетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 17:29 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
ФУУУУУУУУ[quot Megabrain]AndreTM. Бухгалтера не при чем. Это программа не правильно считает. имелось в виду вовсе не программа, а не при чем не обижайтесь... это для разрядки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2006, 17:30 |
|
||
|
Использование разных типов данных в экономических расчетах
|
|||
|---|---|---|---|
|
#18+
Hi Владимир! 1) Советуют его использовать из-за того что он имеет больший "диапазон точности" если для простых числовых типов это в лучшем случае 53 двоичных разряда (чуть меньше полных 16-ти десятичных разрядов), а для currency это полные 63 двоичных разряда (если не считать знак) - т.е. по сути currency это ЦЕЛОЕ число (просто для удобства отображения всегда "сдвинутое" на 4 разряда), но размером в 8 байт а не в 4 как integer - от того кстати проистекает и большинство особенностей работы с ним. Если думать о нём как о целом числе (гипотетических "сотых долях копейки"), то становится очень просто понять как же его использовать. 2) Тип NUMERIC я бы не советовал безоглядно использовать уже хотя-бы потому что для переменых памяти такового "типа" и вовсе не существует (любое число с точкой будет в памяти хранится как Double), а так же из та того что при записи в такое поле неизбежно будет происходить "обрезание" невидимых частей - т.е. получится что в программе мы видим один результат, а после сохранения в таблицу из-за этого обрезания получим совсем другой - конечно часто нужно намеренно отбрость "доли копейки" - но и тогда лучше это сделать при помощи явного ROUND() нежели при помощи "автообрезания" имеющегося для типа поля NUMERIC. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2006, 01:12 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33492129&tid=1592572]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 461ms |

| 0 / 0 |
