Ответ 1
Поплавки не являются точными и могут вводить кумулятивные ошибки округления. Decimal - лучший формат финансовой информации, который должен быть точным.
Какой тип (плавающий или десятичный) лучше всего использовать для хранения цен в базе данных mysql?
Поплавки не являются точными и могут вводить кумулятивные ошибки округления. Decimal - лучший формат финансовой информации, который должен быть точным.
Цены - это десятичные значения, и расчеты на них, как ожидается, будут вести себя как десятичные дроби, когда дело доходит до округления, литералов и т.д.
Именно то, что делают десятичные типы.
Поплавки хранятся в виде двоичных дробей, и они не ведут себя как десятичные дроби - их поведение часто не то, что ожидали люди, использующие десятичную математику. Подробнее читайте Руководство по плавающей запятой.
Для денежных значений никогда не используйте бинарные типы с плавающей запятой, особенно когда у вас есть отличный хороший десятичный тип!
Для финансовых расчетов используйте Decimal
В соответствии с IEEE 754 поплавки всегда были двоичными, только новый стандарт IEEE 754R определял десятичные форматы. Многие дробные двоичные части никогда не могут сравниться с точным десятичным представлением. Любое двоичное число можно записать в виде m/2 ^ n (m, n положительных целых чисел), любое десятичное число при m/(2 ^ n * 5 ^ n). Поскольку двоичные файлы не имеют первичного коэффициента 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
Итак, для финансовых расчетов используйте Decimal not FLOAT
Когда мы храним число в float, мы не сохраняем точное число, это приближение. Целочисленная часть получает приоритет, а дробная часть - как размер шрифта. Поэтому, если у вас есть расчеты и нужен точный результат, используйте Decimal.
Пожалуйста, используйте BigDecimal, так как это лучше всего подходит для цен, поскольку копейки округлены правильно до доллара.
Джошуа Блох рекомендует BigDecimal.