Какой режим округления будет использоваться для манипулирования валютой в Java? - PullRequest
43 голосов
/ 21 ноября 2011

Я прочитал на сайте Java, чтобы использовать BigDecimal для валют.http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Но какой режим округления мы должны использовать?который является наиболее подходящим и наиболее широко используемым

Ответы [ 5 ]

49 голосов
/ 21 ноября 2011

Нет «правильного» режима, это зависит от бизнес-ситуации.Примеры:

  • При расчете годовых налогов дробные части часто обрезаются (RoundingMode.FLOOR).
  • При расчете бонуса вы можете всегда округлять в пользу клиента(RoundingMode.CEILING).
  • Для налогов на счет вы обычно округляете HALF_UP
  • При выполнении сложных финансовых симуляций вы вообще не хотите округлять.

Документация для RoundingMode содержит множество примеров того, как работают различные режимы.

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

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

18 голосов
/ 21 ноября 2011

Большую часть времени BigDecimal является единственным допустимым выбором для валют.Но выбор стратегии округления не так очевиден.

По умолчанию установлено значение HALF_EVEN , что является хорошим выбором.Этот алгоритм известен как банковское округление (см. Обсуждение здесь ).

Другая распространенная стратегия - HALF_UP , которая более интуитивна, но немногохудшие статистические характеристики.

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

11 голосов
/ 21 ноября 2011

Обычно вы используете округление «вдвое», например:

myBigDecimal.setScale(2, RoundingMode.HALF_UP);

Таким образом, вы округляете до двух десятичных знаков (которые используют большинство валют, например, доллары и центы, очевидно,являются исключениями), и вы округлите значения таким образом, что половина или больше округляется вверх, а меньше половины - округляется.См. javadoc для получения более подробной информации.

4 голосов
/ 21 ноября 2011

Для финансовых приложений ROUND_HALF_EVEN - самый распространенный режим округления. Этот режим позволяет избежать смещения. Но для отображения вы должны использовать класс NumberFormat. Этот класс будет заниматься вопросами локализации для сумм в разных валютах. Но NumberFormat принимает только примитивы. Поэтому используйте последний, если вы можете принять небольшое изменение точности в преобразованиях в двойное число.

0 голосов
/ 21 ноября 2011

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

. При отображении суммы делите ее на соответствующий коэффициент, чтобы получить нецелую часть.

...