Я создаю этот API, и в базе данных будут храниться значения, представляющие одно из следующих:
- процент
- средний
- ставка
Я, честно говоря, понятия не имею, как представить что-то, что диапазон составляет от 0 до 100% в цифрах. Должно ли это быть
- 0,00 - 1,00
- 0,00 - 100,00
- любая другая альтернатива, которую я не знаю
Есть ли четкий выбор для этого? Глобальный способ представления в базах данных чего-то, что идет от 0 до 100% процентов? Идем дальше, какой правильный тип для него, с плавающей запятой или десятичный?
Спасибо.
int
для обозначения сотых или в единицах Permyriad или ‱ .Ответы:
Я займу противоположную позицию.
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 байта) с предварительным определением того, что вам всегда будет нужна указанная точность .источник
Я бы вообще рекомендовал не использовать
float
. Числа с плавающей запятой действительно представляют числа в base-2, что приводит к округлению некоторых (точных) чисел в операциях или сравнениях, потому что они просто не могут быть точно сохранены в base-2. Это может привести к удивительному поведению.Рассмотрим следующий пример :
Base-2 сравнение числа
1.3
не удается. Это сложно.Для сравнения, десятичная дробь обеспечивает точное представление конечных чисел в их диапазоне. Если вы переключитесь
float
наdecimal(2, 1)
приведенный выше пример, вы получите ожидаемые результаты.источник
Разница между float и decimal заключается в точности. Десятичное число может на 100% точно представлять любое число с точностью до десятичного формата, тогда как число с плавающей запятой не может точно представлять все числа.
Используйте десятичное значение, например, для значения, связанного с финансами, и используйте значение float, например, для значения, связанного с графикой
источник
Я рекомендую использовать,
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 )
https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
источник
Десятичное число: в финансовых приложениях лучше использовать десятичные типы, потому что это обеспечивает высокий уровень точности и позволяет легко избежать ошибок округления.
Double: Double Types, вероятно, наиболее часто используемый тип данных для реальных значений, за исключением обработки денег.
Float: он используется в основном в графических библиотеках, потому что очень высокие требования к вычислительной мощности, также используются ситуации, которые могут выдержать ошибки округления.
Ссылка: http://net-informations.com/q/faq/float.html
источник
Десятичное число сделало именно то, что должно было быть сделано в этом случае, оно обрезало остальные, таким образом, потеряв 1/3 часть.
Так что для сумм десятичная дробь лучше, но для делений поплавок лучше, до некоторой точки, конечно. Я имею в виду, что использование DECIMAL никоим образом не даст вам «безошибочную арифметику».
Я надеюсь, это поможет.
источник
В tsql: Float 0,0 хранится как 0, и его не нужно определять после десятичной точки, например, вам не нужно писать Float (4,2). Десятичный, 0,0 хранить как 0,0, и он имеет возможность определять как десятичное число (4,2), я бы предложил 0,00-1,00, делая это, вы можете вычислить значение этого процента без умножения на 100, и если вы сообщаете, затем установите тип данных из этого столбца в процентах, как MS Excel и другой вид платформы, как
0.5 -> 50%
.источник