Когда использовать float против десятичного

14

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

  • процент
  • средний
  • ставка

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

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

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

Спасибо.

Аманда Феррари
источник
5
Числа могут храниться разными способами. Нет ничего плохого в том, чтобы хранить процент в 0-100 или 0-1. Важно то, что вам нужно делать с числами, какую точность вам нужно, и так далее. Вы должны объяснить больше контекста, прежде чем дать хороший ответ. Вам нужно хранить числа, которые точно представлены с небольшим количеством десятичных цифр? Если вы усредняете вещи, вы получаете доли, например, трети или седьмые. Вам нужно хранить их точно? Или только примерно? Как примерно? Что ты будешь с ними делать?
Эрик Постпишил
1
Если значения от 0,00 до 100,00 с шагом 0,01, то это 10001 различных значений. Просто используйте intдля обозначения сотых или в единицах Permyriad или .
chux - Восстановить Монику
@ chux-ReinstateMonica - Да, "масштабированные целые числа" возможны, но неуклюжи.
Рик Джеймс
@RickJames Возможно. Я не нашел сложное целое число трудно.
chux - Восстановить Монику

Ответы:

4

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

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

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

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

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

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

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

Больше

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

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

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

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

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

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

Рик Джеймс
источник
3

Я бы вообще рекомендовал не использовать 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 |
| --: |

Base-2 сравнение числа 1.3не удается. Это сложно.

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

GMB
источник
4
Этот ответ неверен в нескольких отношениях. «Для сравнения, десятичные имеют меньший диапазон, но обеспечивают точное представление конечных чисел в этом диапазоне» ложно: десятичное не представляет ⅓ точно. «Некоторые (точные, конечные) числа округляются» неверно; числа не являются «округлением». Конверсии и другие операции могут округляться. Режим округления по умолчанию чаще всего является округлением до ближайшего числа, равного количеству, а не округлением.
Эрик Постпишил
4
Проблемы с точностью связаны не с «числами с плавающей запятой», а просто с числовыми представлениями: все конечные числовые представления имеют ограниченную точность: с плавающей запятой, с фиксированной запятой, целое, рациональное, десятичное, двоичное, все.
Эрик Постпишил
2
Вздох. Что вы исправили? Мой комментарий говорит, что ответ неправильный, потому что он говорит, что десятичное число обеспечивает точное представление чисел в пределах своего диапазона, но на самом деле это не так, потому что оно не обеспечивает точное представление ⅓. Изменение говорит «точный», а не «точный», но тогда почему бинарная плавающая точка не так хороша - ни точна для ⅓, и оба или ни точны, в зависимости от того, какой у вас порог для точности и насколько точна у них есть. Этот вопрос указывает на то, что будут представлены средние значения, а при усреднении трех вещей вы получите числа вроде ⅓.
Эрик Постпишил
4
В комментарии говорится, что чаще всего используется округление до ближайшего числа, даже в ответе, но в ответе все еще говорится о округлении. В ответе говорится, что сравнения могут округляться, но сравнение идеально. Сравнения всегда дают математически правильный результат без округления. (Некоторые языки программирования могут преобразовывать операнды перед сравнением, но это отдельные операции.)
Эрик Постпишил
1
1/3 не может быть точно представлена ​​ни в двоичном, ни в десятичном виде. Скидка 20% от $ 14,99 потребует округления дробных центов не существует.
Рик Джеймс
0

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

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

Йоги Фреста Рахмаван
источник
0

Я рекомендую использовать, 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

jhoanna
источник
0

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

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

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

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

Prabodha
источник
0
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 никоим образом не даст вам «безошибочную арифметику».

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

vishpatel73
источник
0

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

Арсалан Хан
источник