Pull to refresh

Comments 11

Почему не хранить сумму в long?
И оперировать копейками - 1 руб. 10 копеек, будем перечислять 110.

Или BigDecimal

PS не совсем понял про скрины из налоговой и float. Почему вы решили, что там используется float ?

Да, целочисленное хранение денежных единиц распространено в банках, например в платежных API. PS Ну, конечно, я точно не знаю.. но 1) не могу представить как можно недоплатить 3 копейки 2) как-то же у них получились -3 копейки в расчетах? 3) Могла ли получиться такая погрешность без float?

не могу представить как можно недоплатить 3 копейки

У меня пару раз были счета и в 1 копейку. Это просто накопленные пени за несколько дней просрочки.

Если считать за один день, то при 0,3% пени это недоплата 10 руб. Тогда где сами 10 рублей? :)

оперировать копейками

Как только будет надо сосчитать какие то проценты - так и появятся погрешности округления копеек.

Потому что, многим людям, чисто морально, тяжко дается даже просто признать факт существования самого вопроса "а вдруг ошибка была на нашей стороне? ".

Суть поста не в том, на чьей стороне ошибка (я у этого кейса вообще сторонний наблюдатель), а в том что она с большой вероятностью была из-за округления и даже такая небольшая погрешность может привести к серьёзным последствиям.

А завтра вы захотите локализовать этот продукт для использования на рынках Омана и Японии, и узнаете, что в одном риале — тысяча байз, а в одной йене — одна йена.

Вообще нельзя float для финансов использовать. Никогда

Для денег специальные типы придуманы в компьютерах, чтобы эта погрешность не копилась. Ведение бухгалтерии - это отдельное искусство. Если работаете с деньгами, лучше заранее изучить.

А системы, которые используют числа с плавающей точкой для финансов мне встречались. Одно время провайдер использовал такую и людей массово отключали за неуплату, потому что к началу месяца у них на счёте числился долг в 0,01 копейки. Просто абонентская плата списывалась каждый день. И в один прекрасный момент вылезает погрешность из-за того, что сумма делится на число дней. Лечилось там просто установкой порога отключения в 1 рубль (с запасом). А потом, благо, эту систему сменили.

P.S. Систему звали Bill-Master.

Читал байку, что в далёкие дофидошные годы в далёкой стране программисты в банке сообразили погрешности округления при расчете процентов переносить на отдельный счёт и сказочно обогатились поначалу

Sign up to leave a comment.

Articles