Я прочитал на сайте java для использования BigDecimal
для валют.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Но какой режим округления мы должны использовать? который является наиболее подходящим и наиболее широко нас
Я прочитал на сайте java для использования BigDecimal
для валют.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Но какой режим округления мы должны использовать? который является наиболее подходящим и наиболее широко нас
Нет "правильного" режима, это зависит от бизнес-кейса. Примеры:
RoundingMode.FLOOR
).RoundingMode.CEILING
).HALF_UP
Документация RoundingMode содержит множество примеров работы различных режимов.
Чтобы получить лучший ответ, вы должны сообщить нам, чего вы хотите достичь.
Тем не менее, BigDecimal
является правильным типом для использования в Java, потому что он может сохранить любую точность, плюс он позволяет вам выбрать режим округления, наиболее подходящий для вашего случая.
В большинстве случаев BigDecimal
является единственным допустимым выбором для валют. Но выбор стратегии округления не так очевиден.
По умолчанию используется HALF_EVEN, что является хорошим выбором. Этот алгоритм известен как округление банкиров (см. Обсуждение здесь).
Другая распространенная стратегия HALF_UP, которая более интуитивно понятна, но имеет несколько худшие статистические характеристики.
Также обратите внимание, что во многих случаях (особенно в банковской сфере и страховании) стратегия округления будет определяться требованиями бизнеса, часто различающимися для различных случаев использования.
Как правило, вы должны использовать закругление "half up", например:
myBigDecimal.setScale(2, RoundingMode.HALF_UP);
Таким образом, вы округлите до двух знаков после запятой (которые используются большинством валют, например, доллары и центы, очевидно, есть исключения), и вы будете округлять значения таким образом, чтобы полцены или более округлялись, половина процента округляется. Подробнее см. javadoc.
Для финансовых приложений ROUND_HALF_EVEN является наиболее распространенным режимом округления. Этот режим позволяет избежать предвзятости. Но для отображения вы должны использовать класс NumberFormat. Этот класс позаботится о проблемах локализации для сумм в разных валютах. Но NumberFormat принимает только примитивы. Поэтому используйте последнюю, если вы можете принять небольшое изменение точности в преобразованиях в double.
Вы не должны использовать десятичный тип для валют. Используйте целочисленный тип. Это сохраняет точность покупки, избегая ошибки округления, связанной с поплавками.
При отображении суммы затем разделите на соответствующий коэффициент, чтобы получить нецелую часть.