Представление денег целыми числами/BigInteger против BigDecimal

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

Мы сразу же начали страдать от ошибок с плавающей запятой, и нам пришлось провести серьезный рефакторинг. Мы использовали библиотеку произвольной точности, которая решила эту проблему. Однако это не изменило того факта, что вы можете получить доли цента. Как ты собираешься это округлить? Короткий ответ: «это сложно».

Сейчас готовлюсь начать работу над аналогичным приложением на замену старому. Я обдумывал это годами. Я всегда думал, что будет проще всего создать тип данных money, который заключает в себе целое число (или BigInteger) для представления количества пенни с функцией для печати в традиционном удобном для человека формате $0.00.

Однако, исследуя это, я нашел JSR 354, недавно реализованный Java Money API. Я был удивлен, обнаружив, что он поддерживает свое представление денег с помощью BigDecimal. Из-за этого он включает в себя специальную логику для округления.

В чем преимущество использования в расчетах долей цента? Почему я должен делать это вместо того, чтобы говорить, что один цент — это «атомарная» форма денег?


person Community    schedule 18.05.2017    source источник
comment
Потому что это не так. Сегодня я купил товары по цене в дробные центы.   -  person user207421    schedule 18.05.2017


Ответы (1)


Это широкий вопрос, потому что его ответ зависит от его реализации.

Если бы я купил 1000 предметов оптом за 5 долларов, то каждый предмет по отдельности стоил бы 0,005 доллара, что меньше, чем то, что вы называете «атомарной формой» денег, 0,01 доллара.

Если бы мы считали 0,01 доллара минимально возможной суммой, то мы не смогли бы обрабатывать вычисления в определенных ситуациях, как в моем примере.

По этой причине API JavaMoney обрабатывает множество дробных цифр, гарантируя, что точность в таких случаях не будет потеряна.

person Jacob G.    schedule 18.05.2017