Я пытался реорганизовать приложение реального времени, которое использует BigDecimal
, в представление с фиксированной точкой с 10 десятичными цифрами, используя long
, поскольку это то, что обычно рекомендуется для хранения и манипулирования деньгами в Java.Проблема в том, что мне нужно также иметь дело с коэффициентами (обменными курсами, ставками дисконтирования, процентами и т. Д.), И я не уверен, как это сделать разумным образом.
Поэтому для создания этих десятичных дробей я делаюthis (инкапсулировано в классе курса):
long multiplier = (long) Math.pow(10, precision)
long decimal = 1.2345 * multiplier; // 12345000000
Вот несколько основных операций с этим представлением:
long addition = decimal1 + decimal2;
long subtraction = decimal1 - decimal2;
long multiplication = (decimal1 * decimal2) / multiplier;
long division = (decimal1 * multiplier) / decimal2;
Как вы можете видеть, умножения и деления, написанные подобным образом, являются склоннымипереполнению даже для небольших номеров.Это значительно уменьшает диапазон допустимых аргументов для этих операций.
Так что некоторые могут спросить, зачем вам это вообще нужно?Ну, например, чтобы конвертировать валюту в другую: eur=usd*rate
, или чтобы получить возврат инвестиций: roi=profit/investment
.
Каков реальный путь, чтобы получить хорошую точность до определенного уровняколичество цифр и отличная производительность (максимально приближенная к использованию примитивных типов)?