Size: a a a

Software Design/Architecture/Zen

2021 June 26

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Когда начинал писать - нет. Но когда увидел, что получилось)))
ЗЫ: если долго смотреть на этот код, то он начинает смотреть в тебя)
источник

ST

Serguei Tarassov in Software Design/Architecture/Zen
Полностью поддерживаю. Нужен некий аналог decimal - фиксированного дробного числа типа с 4 знаками после запятой. Иначе финотчеты "не бьются" по итогам в колонках с выводимыми в них значениями
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
У меня в доке есть отсылки на другие решения. В мадженте, как раз, 4 знака - и это не спасает их от ошибок округления https://magento.stackexchange.com/questions/225168/magento1-9-paypal-rounding-amount-issue
источник

DP

Dimitry Polonskiy in Software Design/Architecture/Zen
@mkusher , я по поводу заявок и спецификации - проверки на новый агрегат еще раз.

Заявку можно создать
Над заявкой можно проводить разные действия.

Для того, чтобы таких ситуация не случалось можно разделить на два контекста
Менеджмент заявок
И еще один (не смог придумать название), через который идет создание.
источник

ST

Serguei Tarassov in Software Design/Architecture/Zen
Так и должно быть, полностью от ошибок округления избавиться нельзя (типовой случай - расчет НДС по колонкам), но можно избавиться от элементарных ошибок.
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Избавиться можно, если использовать дроби
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Смотря, какая модель подсчётов. В моей модели нет места "дробным прайсам"
Кстати, любителям считать всё только в целых числах - в джс нету отдельного флоата, как в пыхе - там всё намбер. И 16.90*100 !== 1690
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Я бы посмотрел, как вы эти "дроби" отправляете на payment system provider (PSP), например, PayPal
Каждый инвойс, рефанд и войд - должен иметь конкретную сумму в деньгах, не дробную)))
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Отправлять результирующее значение. А все внутренние хранения и промежуточные вычисления можно производить дробями.
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Окей. Можно, наверное... Но моя модель не основана на дробях, и там не нужно бороться с ошибками округления
Наверное, если на дробях, то будет вероятность того, что два рефанда на цент больше/меньше инвойса (вы ведь каждый округлили для PSP)
источник

ST

Serguei Tarassov in Software Design/Architecture/Zen
Где использовать, в документах?
источник

SP

Stanislav Popov in Software Design/Architecture/Zen
дроби тоже могут переполниться. дроби хорошо работают там где есть общий знаменатель, в периодических процессах, например для позиционирования в чпу )
источник

SP

Stanislav Popov in Software Design/Architecture/Zen
при сложении дробей где знаменатели будут простыми числами у вас будет мгновенное переполнение
источник

ST

Serguei Tarassov in Software Design/Architecture/Zen
Обсуждаемая проблема не в переполнении, а в несоответствии точности представления и точности хранения.
источник

SP

Stanislav Popov in Software Design/Architecture/Zen
получаете переполнение - убиваете точность
источник

SP

Stanislav Popov in Software Design/Architecture/Zen
вернее вы впринципе уходите из безошибочных расчетов. т.е. невозможность сложить дроби это ошибка
источник

DE

Dmitry Eliseev in Software Design/Architecture/Zen
Большие вычисления работают со строками в столбик
источник

˸A

˸̧̨ ͅBlack Akula˸̧̨ ... in Software Design/Architecture/Zen
Думаю, к расчёту денег это мало относится
источник

ST

Serguei Tarassov in Software Design/Architecture/Zen
Еще раз,  проблема не в простых дробях или double, а в представлении.
Внутри - три величины, неважно  по 1/3 рубля или по 0,3(3). Представление - три цены по 33 копейки. В итоге по колонке должно стоять 99 копеек, а не 1 рубль.
источник

SP

Stanislav Popov in Software Design/Architecture/Zen
ну вы понимаете что сложив столько рублей вы уже начитаете выходить на инты?

In [8]: Fraction(1,3557) + Fraction(1,3559) + Fraction(1,3571) + Fraction(1,3541) + Fraction(1,3539)
Out[8]: Fraction(797148104090641, 566510798800541527)
источник