Числа с плавающей точкой
-
- Сообщения: 31
- Зарегистрирован: 2019.06.20, 12:38
Числа с плавающей точкой
Скажите, слышал такой совет, что данные с плавающей точкой лучше хранить целым числом в INT умноженным на 100 например (если число например 123.45). Потому что decimal, который хранит данные с плавающей точкой, выводит неверные данные при выборке строк. Это действительно самый грамотный способ? Просто у меня много числовых значений с плавающей точкой, и нужно будет постоянно умножать, потом на выходе делить, при выгрузке товаров по csv это снова передавать всё, а потом на сайте номер 2 делить/умножать и такая песня постоянно.
Re: Числа с плавающей точкой
Хранить цены в копейках - обычная практика
Yii2 universal module sceleton - for basic and advanced templates
Re: Числа с плавающей точкой
Какии образом выводятся не верные данные с плавающей точкой? Имеются числа с плавающей точкой и не встречал косяков ещеgbushmakin писал(а): ↑2020.02.04, 18:20 Скажите, слышал такой совет, что данные с плавающей точкой лучше хранить целым числом в INT умноженным на 100 например (если число например 123.45). Потому что decimal, который хранит данные с плавающей точкой, выводит неверные данные при выборке строк. Это действительно самый грамотный способ? Просто у меня много числовых значений с плавающей точкой, и нужно будет постоянно умножать, потом на выходе делить, при выгрузке товаров по csv это снова передавать всё, а потом на сайте номер 2 делить/умножать и такая песня постоянно.
Re: Числа с плавающей точкой
Хранить можно как угодно, но в арифметических операциях int использовать надёжнее. Лично я предпочитаю хранить всё, что касается денег в копейках (int), а какие-нибудь коэффициенты в decimal(18,3). Можно для веб-форм и для логики использовать разные модели. Где работает логика и сложные вычисления используем модель без преобразований, а если нужно отображать в таблицах/формах/экспорте включается модель с поведениями на деление и умножение на 100.
Re: Числа с плавающей точкой
да.gbushmakin писал(а): ↑2020.02.04, 18:20 Скажите, слышал такой совет, что данные с плавающей точкой лучше хранить целым числом в INT умноженным на 100 например ... Это действительно самый грамотный способ?
Роберт Мартин: «Использовать числа с плавающей точкой для представления денежных сумм — почти преступление»
Возьмите за правило: если можно обойтись целочисленной арифметикой - то ею и нужно обойтись. даже когда речь не о деньгах.
просто уточните у бизнеса требуемую точность.
недавно даже встретил в обсуждении упоминание о проекте, для бека которого была выбрана Node.js+Typescript и в конце устав бороться с отсутствием в js целых чисел - переписали на .NET
Так что вспоминайте о float вот когда никак по другому.
P.S.
погуглил пример
- Был на собеседовании, спросили, "в переменной какого типа лучше хранить деньги", сказал Float, мол скорость, все дела. - забраковали.
Ответ:
Для денег важны "копейки". Потеря любой значащей цифры в финансовой сфере недопустима. Поскольку числа хранятся в двоичной системе - почти любое десятичное нецелое число не имеет конечное количество цифр после запятой. Поскольку мы не можем хранить бесконечно большое количество цифр после запятой, часть числа теряется.
Простой пример: 5.1 переведем в двоичный вид
Целая часть имеет только 3 цифры
5₁₀ = 1*2² + 0*2¹ + 1*2⁰ = 101₂
А вот дробная...
.1₁₀ = 0*2⁻¹ + 0*2⁻² + 0*2⁻³ + 1*2⁻⁴ + 1*2⁻⁵ + 0*2⁻⁶ + 0*2⁻⁷ + 1*2⁻⁸ + 1*2⁻⁹...
Если взять только первые 7 цифр (двоичных) после запятой, получится не 0.1, а 0.09375
https://ru.stackoverflow.com/questions/ ... oat-double
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.