Числа с плавающей точкой

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Числа с плавающей точкой

Сообщение gbushmakin »

Скажите, слышал такой совет, что данные с плавающей точкой лучше хранить целым числом в INT умноженным на 100 например (если число например 123.45). Потому что decimal, который хранит данные с плавающей точкой, выводит неверные данные при выборке строк. Это действительно самый грамотный способ? Просто у меня много числовых значений с плавающей точкой, и нужно будет постоянно умножать, потом на выходе делить, при выгрузке товаров по csv это снова передавать всё, а потом на сайте номер 2 делить/умножать и такая песня постоянно.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Числа с плавающей точкой

Сообщение maleks »

Хранить цены в копейках - обычная практика
Yii2 universal module sceleton - for basic and advanced templates
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Числа с плавающей точкой

Сообщение unknownby »

gbushmakin писал(а): 2020.02.04, 18:20 Скажите, слышал такой совет, что данные с плавающей точкой лучше хранить целым числом в INT умноженным на 100 например (если число например 123.45). Потому что decimal, который хранит данные с плавающей точкой, выводит неверные данные при выборке строк. Это действительно самый грамотный способ? Просто у меня много числовых значений с плавающей точкой, и нужно будет постоянно умножать, потом на выходе делить, при выгрузке товаров по csv это снова передавать всё, а потом на сайте номер 2 делить/умножать и такая песня постоянно.
Какии образом выводятся не верные данные с плавающей точкой? Имеются числа с плавающей точкой и не встречал косяков еще
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Числа с плавающей точкой

Сообщение Alexum »

Хранить можно как угодно, но в арифметических операциях int использовать надёжнее. Лично я предпочитаю хранить всё, что касается денег в копейках (int), а какие-нибудь коэффициенты в decimal(18,3). Можно для веб-форм и для логики использовать разные модели. Где работает логика и сложные вычисления используем модель без преобразований, а если нужно отображать в таблицах/формах/экспорте включается модель с поведениями на деление и умножение на 100.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Числа с плавающей точкой

Сообщение skynin »

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
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Ответить