Java быстрое представление денег? - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над приложением реального времени, которое работает с деньгами в разных валютах и ​​с обменными курсами с использованием BigDecimal, однако я сталкиваюсь с некоторыми серьезными проблемами с производительностью и хочу изменить базовое представление.

IСнова и снова читаем, что хорошим и быстрым способом представления денег в Java является хранение центов (или любой необходимой точности) с использованием long.Как указано в одном из комментариев, есть некоторые библиотеки с обертками, которые делают именно это, например, FastMoney из JavaMoney .

Два вопроса здесь.

  1. Всегда ли безопасно хранить деньги как длинные (или внутри обертки), а все остальное (например, обменные курсы) хранить в двойном размере?Другими словами, не столкнусь ли я с теми же проблемами, что и все в удвоении, если я сделаю Math.round(money * rate) (деньги - это центы, а ставка - двойные)?

  2. FastMoney имногие другие библиотеки поддерживают только операции между ними и примитивными типами.Как я могу получить точное представление, скажем, о возврате инвестиций, если я не могу сделать profit.divide(investment) (оба из них FastMoney).Я предполагаю, что идея состоит в том, чтобы преобразовать оба в двойные числа, а затем разделить их, но это было бы неточно, верно?

1 Ответ

0 голосов
/ 28 мая 2018

Функция, которую вы ищете, уже реализована в библиотеке JavaMoney.

У нее есть класс FastMoney, который выполняет long арифметику, что именно то, что вы просили.

Для новых разработчиков Java - почему длинная, а не двойная?

Арифметика с плавающей точкой в ​​Java приводит к неожиданным ошибкам в точности из-за их реализации.Следовательно, это не рекомендуется в финансовых расчетах.

Также обратите внимание, что это отличается от потери точности в арифметических вычислениях long, которая связана с тем, что дробная часть не сохраняется в лонге.Этого можно избежать во время реализации, переместив дробную часть в другой длинный (например, 1,05 -> 1 доллар и 5 центов).

Ссылки

  1. Краткое руководство

  2. Сайт проекта

...