Кроме того, при обработке валюты нет причины, по которой вы не можете просто хранить целое число, представляющее центы, а не доллары, так что вы фактически получаете представление с фиксированной запятой. например, $ 4,09 сохраняется как 409 и так далее. (Вы также можете хранить десятые доли цента , т. Е. 4090 или другую постоянную дробную точность.) Вы сможете добавлять и вычитать бесконечное количество раз, не теряя точности.
Для таких вычислений, как проценты, выполните вычисления с числами с плавающей запятой, а затем просто округлите до необходимой точности перед сохранением. Сам расчет процентов будет иметь необходимую точность, и вы будете последовательно округлять до одного и того же числа десятичных разрядов каждый период, что обычно является тем, что вам нужно в финансовых расчетах (я никогда не видел учреждения, которое действительно хочет отслеживать 0,0000 один период оплаты до другого - по юридическим причинам они будут округлять свои книги с определенной точностью.)
Обычное подписанное int хранение центов позволит вам получить до 21 474 836,47 долларов. Вы можете использовать long для хранения $ 92 233 720 368 547 758,07. Для работы с более чем квадриллионами денежных единиц (представляющих бюджет США в долларах Зимбабве?) Используйте BigDecimal.
Вы можете узнать больше о сравнениях с плавающей запятой здесь:
Что должен знать каждый компьютерщик об арифметике с плавающей точкой