По плавающей или десятичной цене?

Какой тип (плавающий или десятичный) лучше всего использовать для хранения цен в базе данных mysql?

Ответы

Ответ 1

Поплавки не являются точными и могут вводить кумулятивные ошибки округления. Decimal - лучший формат финансовой информации, который должен быть точным.

Ответ 2

Цены - это десятичные значения, и расчеты на них, как ожидается, будут вести себя как десятичные дроби, когда дело доходит до округления, литералов и т.д.

Именно то, что делают десятичные типы.

Поплавки хранятся в виде двоичных дробей, и они не ведут себя как десятичные дроби - их поведение часто не то, что ожидали люди, использующие десятичную математику. Подробнее читайте Руководство по плавающей запятой.

Для денежных значений никогда не используйте бинарные типы с плавающей запятой, особенно когда у вас есть отличный хороший десятичный тип!

Ответ 3

Для финансовых расчетов используйте 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

Ответ 4

Когда мы храним число в float, мы не сохраняем точное число, это приближение. Целочисленная часть получает приоритет, а дробная часть - как размер шрифта. Поэтому, если у вас есть расчеты и нужен точный результат, используйте Decimal.

Ответ 5

Пожалуйста, используйте BigDecimal, так как это лучше всего подходит для цен, поскольку копейки округлены правильно до доллара.

Джошуа Блох рекомендует BigDecimal.