Несколько лет назад я помог написать приложение, касающееся денег и страховки. Изначально мы представляли деньги числами с плавающей запятой (знаю, это большой запрет). Большая часть приложения просто добавляла и вычитала значения, поэтому проблем не возникало. Однако определенные части касались процентов денежной стоимости, следовательно, умножения и деления.
Мы сразу же начали страдать от ошибок с плавающей запятой, и нам пришлось провести серьезный рефакторинг. Мы использовали библиотеку произвольной точности, которая решила эту проблему. Однако это не изменило того факта, что вы можете получить доли цента. Как ты собираешься это округлить? Короткий ответ: «это сложно».
Сейчас готовлюсь начать работу над аналогичным приложением на замену старому. Я обдумывал это годами. Я всегда думал, что будет проще всего создать тип данных money, который заключает в себе целое число (или BigInteger
) для представления количества пенни с функцией для печати в традиционном удобном для человека формате $0.00
.
Однако, исследуя это, я нашел JSR 354, недавно реализованный Java Money API. Я был удивлен, обнаружив, что он поддерживает свое представление денег с помощью BigDecimal
. Из-за этого он включает в себя специальную логику для округления.
В чем преимущество использования в расчетах долей цента? Почему я должен делать это вместо того, чтобы говорить, что один цент — это «атомарная» форма денег?