Java деньги и отношения, как хранить и манипулировать? - PullRequest
0 голосов
/ 29 мая 2018

Я пытался реорганизовать приложение реального времени, которое использует 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.

Каков реальный путь, чтобы получить хорошую точность до определенного уровняколичество цифр и отличная производительность (максимально приближенная к использованию примитивных типов)?

Ответы [ 2 ]

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

Используйте примитивные типы и храните центы (не доллары / евро / что угодно)!

Это то, что делают банки, и то, что вы должны делать тоже.

Ввод десятичной точки в числе рендеринг проблема;не позволяйте рендерингу влиять на ваш основной тип данных.

long центов точно удержит общий глобальный долг в тысячи раз - он достаточно большой, чтобы вместить любое значение, с которым вы когда-либо столкнетесь.

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

Ваш вопрос не имеет смысла.

  1. Вы только умножаете деньги на скаляры.Не имеет смысла умножать две суммы денег вместе.Что именно вы ожидаете?Квадратные деньги?
  2. Результат деления денежной суммы на другую не является денежной суммой.Это соотношение, например, обменный курс.

Примечание: long содержит намного больше десяти десятичных цифр.Больше похоже на 20 с руки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...