170 похожих чатов

Раз уж тут сидят двое фин. гуру, то вклинюсь и

задам вопрос :))

Как хендлить хранение amount * currencyRate?

Проблема:
5 * 0.027 = 0.135 * 100 = 13 (14 ??)
15 * 0.027 = 0.405 * 100 = 40 (41 ??)

13 + 40 = 53
14 + 41 = 55

20 * 0.027 = 0.54 = 54

53 < 54 < 55

23 ответов

30 просмотров

что это за формулы

Dmytro-Svyrydenko Автор вопроса
Alexey Ermakov
что это за формулы

Обновил – добавил текст для ясности

рейты и все остальное храни в целом виде

Ты неправильно округляешь в своих примерах. 13.5 надо округлить до 14, 40.5 до 40. И тогда сумма сойдётся Но вообще проблема в потере точности. Тебе надо работать со значениями без округления до тех пор, пока оно не понадобится. То есть 13.5 + 40.5 = 54 И хранить, и вычислять всё надо в самой мелкой денежной единице (копейки, центы)

Алексей Попов
Ты неправильно округляешь в своих примерах. 13.5 н...

вот не могу понять, а к чему это всё, если правильно (как мне кажется), округлять уже конечную сумму, что бы избавится от копеек.. Т.е. сделать так, как делают на кассе в супермаркете (у них явно статистики хватает что бы делать правильно)?

Kvhqm Mboe
вот не могу понять, а к чему это всё, если правиль...

Они просто ещё до сих пор считают, какая погрешность 😂😂

Dmytro-Svyrydenko Автор вопроса
Dmytro Svyrydenko
Т.е. условно вместо 15 * 0.027 нужно делать как?

Что такое 15, и что такое 0.027? Не округлять пока не потребуется конечный результат

Spyro
Они просто ещё до сих пор считают, какая погрешнос...

Хз, похоже на микро-оптимизацию. Т.е на те случаи, когда выбирают что быстрее, цикл или switch\case, когда у тебя 5 страниц, и три условия :)

Dmytro-Svyrydenko Автор вопроса
Алексей Попов
Что такое 15, и что такое 0.027? Не округлять пок...

amount 15, currencyRate 0.027 При создании транзакции я в базу записываю refAmount, который считается путем amount * currencyRate

Dmytro-Svyrydenko Автор вопроса
Алексей Попов
Эмаунт 15 это 15 центов/копеек?

А, сорян, это 15 центов/копеек, да, результат 0.15 * 100

Эммм… тут ты немного не понимаешь предметную область. Представь себе здание. Длинный коридор, в котором последовательно расположены кабинеты. В одном кабинете тебе начисляют дивиденды, в другом снимают налоги, в третьем кабинете конвертируют твои деньги в валюту другой страны. Ты идешь по коридору с деньгами. 1. Зашел в первый кабинет, там тебе сделали начисления по формуле, если получилось дробное число, округляют и выдают сумму. 2. Ты выходишь из первого кабинета, у тебя на руках сумма кратная копейке, нельзя разрубить копейку на пополам. 3. Когда ты заходишь во второй кабинет, у тебя на руках УЖЕ округленная сумма, между кабинетами, ты носишь уже округленную сумму. Здесь кабинет, это финансовая формула. Внутри кабинета/финансовой формулы, расчеты должны проводиться по полной точности без округления, округляется конечный результат, когда ты собираешься уже выйти из кабинета/формулы. Так вот. Сумма результатов операций A и B может отличаться на 1 копейку от результата операции С, в которой в формулу занесли сумму денег равной A и B. 1 копейка, это немного. Это не расчеты траекторий полета космического корабля, копейки позволительно терять на границах кабинетов/формул/операций.

Dmytro-Svyrydenko Автор вопроса
Эркин Бахтушкин
Эммм… тут ты немного не понимаешь предметную облас...

Понимаю Плюс, у меня эта проблема заметна только в выводе статистики Она меня бесит из-за юнит-тестов, в которых приходится иногда +1 или -1 добавлять, потому решил пофиксить Но самое главное, просто хотел понять правильно ли я делаю такие вещи, ибо опыта ноль Ну и все же при использовании увеличенного мультиплаера, или библиотеки, даже копеечка теряться не будет (в большинстве случаев) :)

Dmytro Svyrydenko
Понимаю Плюс, у меня эта проблема заметна только в...

Тут важно, какую предметную область ты описываешь. У тебя в голове могут быть всякие формулы. Но есть законодательство, есть всякие регламенты расчетов и т.д. и т.п. Для многих может быть нелогичным, как предметная область описана в регламентирующей документации. Поэтому, тем кто проектирует программные продукты, важно погружаться в предметную область. Да, ты можешь сохранить копейку. Но это убьет бизнес, потому что весь бухучет из за этой копейки сломается у него. Задача программиста оцифровать "бумажную логику" в один один, даже если теряется где то копейка.

Dmytro-Svyrydenko Автор вопроса
Эркин Бахтушкин
Тут важно, какую предметную область ты описываешь....

Понимаю ваш посыл) Но пока что для меня это ту мач. Я просто фронтендер который педалит пет-проект для своих финансов 😬

Эркин Бахтушкин
Эммм… тут ты немного не понимаешь предметную облас...

Подскажите пожалуйста, а где выход? Длинный коридор - почему-то нии сразу представил. К сожалению, ни ЧАВО

Вообще это не так страшно, округляйте в ту сторону, какую бизнес скажет: в одном случае копейка убавится у бизнеса, во втором - у клиента. Более интересная ситуация возникает, когда появляются всякие скидочки и прочая чепуха, где надо уже применять математику между округленными сконвертированными значениями. Например апишка может возвращать цену без скидки и скидку в евро, а другой эндпоинт этой апишки возвращает конечную цену и скидку. В этом случае, если мы будем делать что-то типа скидка + цена = цена без скидки не будет совпадать со значением цена без скидки - скидка = цена (при условии, что мы работаем с округленными значениями). Для таких случаев я нашел только одно вменяемое решение - использовать одну формулу подсчета во всем приложении. Конечно не совсем подходит к кейсу описанному вами, но проблема много крови попила несколько месяцев назад, поэтому решил излить душу)

Daniil
Вообще это не так страшно, округляйте в ту сторону...

Можно пополам округлять, находить разницу, делить на два

Daniil
Что значит "пополам округлять"?

После запятой что пишет?

Алексей Попов
Подскажите пожалуйста, а где выход? Длинный корид...

Современная финансовая система не предлагает выхода 🙈 П.с. обожаю НИИЧАВО и прочие штукенции его создателей)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта