Когда использовать float против десятичного - PullRequest
15 голосов
/ 22 января 2020

Я создаю этот API, и в базе данных будут храниться значения, представляющие одно из следующих значений:

  • процент
  • средний
  • показатель

Я, честно говоря, понятия не имею, как представить что-то, что диапазон составляет от 0 до 100% в числах. Должно ли это быть

  • 0,00 - 1,00
  • 0,00 - 100,00
  • любая другая альтернатива, которую я не знаю

Есть ли четкий выбор для этого? Глобальный способ представления в базах данных чего-то, что идет от 0 до 100% процентов? В дальнейшем, какой тип для него правильный, с плавающей запятой или десятичный?

Спасибо.

Ответы [ 7 ]

4 голосов
/ 23 января 2020

Я займу противоположную позицию.

FLOAT для приблизительных чисел, таких как проценты, средние и т. Д. c. Форматирование следует выполнять при отображении значений либо в коде приложения, либо с помощью функции FORMAT() MySQL.

Никогда не проверяйте float_value = 1.3; Есть много причин, почему это не удастся.

DECIMAL следует использовать для денежных значений. DECIMAL позволяет избежать второго округления, когда значение необходимо округлить до долларов / центов / евро / и т. Д. c. Бухгалтеры не любят доли центов. Реализация DECIMAL

MySQL допускает 65 значащих цифр; FLOAT дает около 7, а DOUBLE около 16. 7 обычно более чем достаточно для датчиков и научных c вычислений.

Что касается "процента" - иногда я использовал TINYINT UNSIGNED, когда я хотите использовать только 1 байт памяти и не нуждаетесь в большой точности; иногда я использовал FLOAT (4 байта). Тип данных не настроен специально для процентов. (Также обратите внимание, что DECIMAL(2,0) не может содержать значение 100, поэтому технически вам потребуется DECIMAL(3,0).)

Или иногда я использовал FLOAT, который содержал значение от 0 до 1. Но тогда мне нужно было бы убедиться, что нужно умножить на 100, прежде чем отобразить «процент».

Подробнее

Все три «процент, средний, показатель» пахнут как float, так что это будет мой первый выбор.

Один критерий для выбора типа данных ... Сколько копий значения будет существовать?

Если у вас есть таблица из миллиарда строк с в столбце для процента, учтите, что TINYINT займет 1 байт (всего 1 ГБ), а FLOAT займет 4 байта (всего 4 ГБ). OTOH, в большинстве приложений не так много строк, поэтому это может не относиться к делу.

Как правило, для "точных" значений следует использовать некоторую форму INT или DECIMAL. Неточные вещи (научные c вычисления, квадратные корни, деление и т. Д. c) должны использовать FLOAT (или DOUBLE).

Кроме того, форматирование вывода как правило, следует оставить на передний конец приложения. То есть, хотя «среднее» может вычисляться как «14,6666666 ...», на дисплее должно отображаться что-то вроде «14,7»; это дружелюбнее к людям. Между тем, у вас есть базовое значение, чтобы позже решить, что «15» или «14.667» является предпочтительным форматированием вывода.

Диапазон «0.00 - 100.00» можно сделать с помощью FLOAT и использовать вывод форматирование или DECIMAL(5,2) (3 байта) с предварительным определением того, что вам всегда будет нужна указанная точность .

3 голосов
/ 22 января 2020

Я бы вообще не рекомендовал использовать float. Числа с плавающей запятой действительно представляют числа в base-2, что приводит к округлению некоторых (точных) чисел в операциях или сравнениях, потому что они просто не могут быть точно сохранены в base-2. Это может привести к удивительному поведению.

Рассмотрим следующий пример :

create table t (num float);
insert into t values(1.3);

select * from t;

| num |
| --: |
| 1.3 |

select * from t where num = 1.3;

| num |
| --: |

Сравнение числа 1.3 с базой 2 не удается. Это сложно.

Для сравнения, десятичное обеспечивает точное представление конечных чисел в их диапазоне. Если вы измените float на decimal(2, 1) в приведенном выше примере, вы получите ожидаемые результаты.

0 голосов
/ 31 января 2020

В t sql: Float, 0.0 хранить как 0, и его не нужно определять после десятичной точки di git, например, вам не нужно писать Float (4,2). Десятичный, 0,0 хранить как 0,0, и он имеет возможность определять как десятичное число (4,2), я бы предложил 0,00-1,00, делая это, вы можете вычислить значение этого процента без умножения на 100, и если вы сообщаете, затем установите тип данных этого столбца в процентах от MS Excel и других платформ, например 0.5 -> 50%.

0 голосов
/ 31 января 2020
mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G

*********************************************************************

@a := (a/3): 33.333333333
@b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

Десятичное число сделало именно то, что должно было быть сделано в этом случае, оно обрезало все остальное, потеряв при этом 1/3 часть.

Таким образом, для сумм десятичное число лучше, но для делений, Поплавок лучше, до некоторой степени, конечно. Я имею в виду, что использование DECIMAL никоим образом не даст вам «безошибочную арифметику c».

Надеюсь, это поможет.

0 голосов
/ 31 января 2020

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

Double: Двойные типы, вероятно, являются наиболее обычно используемым типом данных для реальных значений, за исключением обработки денег.

Float: Он используется главным образом в библиотеках Graphi c, поскольку очень высокие требования к обработке полномочия, также используются ситуации, которые могут выдержать ошибки округления.

Ссылка: http://net-informations.com/q/faq/float.html

0 голосов
/ 31 января 2020

Я рекомендую использовать decimal(5,2), если вы собираетесь сохранить его таким же образом, как вы его отобразите, поскольку decimal предназначен для сохранения точной точности. (См. https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html)

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

(https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html)

Значение с плавающей запятой, записанное в SQL оператор может не совпадать со значением, представленным внутри.

Для столбцов DECIMAL MySQL выполняет операции с точностью до 65 десятичных цифр, что должно решить большинство распространенных проблем неточности.

https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html

0 голосов
/ 30 января 2020

Разница между плавающей точкой и десятичной дробью - это точность. Десятичное число может на 100% точно представлять любое число с точностью до десятичного формата, в то время как число с плавающей запятой не может точно представлять все числа.

Используйте десятичное значение, например, для финансового значения, и используйте число с плавающей точкой, например, графическое значение

...