Следует ли использовать тип данных Float или Decimal для сумм в долларах?
Ответ прост. Никогда не плавает. НИКОГДА !
Числа с плавающей точкой были в соответствии с IEEE 754 всегда двоичными, только новый стандарт IEEE 754R определял десятичные форматы. Многие дробные двоичные части никогда не могут быть равны точному десятичному представлению.
Любое двоичное число может быть записано как m/2^n
(m
, n
положительные целые числа), любое десятичное число как m/(2^n*5^n)
.
Поскольку в двоичных файлах нет простого числа factor 5
, все двоичные числа могут быть точно представлены десятичными знаками, но не наоборот.
0.3 = 3/(2^1 * 5^1) = 0.3
0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]
1/4 1/8 1/16 1/32
Таким образом, вы получите число, большее или меньшее заданного десятичного числа. Всегда.
Почему это имеет значение? Округление.
Нормальное округление означает 0,4 вниз, 5,9 вверх. Так что имеет значение , если результат
или 0.049999999999
.... или 0.0500000000
... Возможно, вы знаете, что это означает 5 центов, но компьютер этого не знает и округляет 0.4999
... вниз (неправильно) и 0.5000
.. вверх (справа).
Учитывая, что результат вычислений с плавающей запятой всегда содержит небольшие ошибки, решение - просто удача. Это становится безнадежным, если вам нужна десятичная округленная до четной обработка с двоичными числами.
Неубедительно? Вы настаиваете, что в вашей учетной записи все отлично?
Активы и пассивы равны? Хорошо, тогда возьмите каждое из заданных форматированных чисел каждой записи, проанализируйте их и суммируйте их с независимой десятичной системой!
Сравните это с отформатированной суммой.
К сожалению, что-то не так, не так ли?
Для этого расчета требовалась предельная точность и точность (мы использовали Oracle
FLOAT), чтобы мы могли записать "миллиардные пенни", которые были начислены.
Не помогает против этой ошибки. Поскольку все люди автоматически предполагают, что компьютер суммирует правильно, практически никто не проверяет самостоятельно.