Which rounding mode to be used for currency manipulation in java?
I have read on java site to use BigDecimal
for currencies.
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
But what rounding mode we should use with? which is the most appropriate one and most widely us
There is no "correct" mode, it depends on the business case. Examples:
- When calculating annual taxes, the fractions are often cut off (
RoundingMode.FLOOR
). - When calculating a bonus, you might want to always round in favor of the customer (
RoundingMode.CEILING
). - For taxes on a bill, you usually round
HALF_UP
- When doing complex financial simulations, you don't want to round at all.
The documentation of RoundingMode contains a lot of examples how the different modes work.
To get a better answer, you must tell us what you want to achieve.
That said, BigDecimal
is the correct type to use in Java because it can preserve any amount of precision plus it lets you chose the rounding mode most suitable for your case.
Most of the time BigDecimal
is the only valid choice for currencies. But the choice of rounding strategy is not that obvious.
The default is HALF_EVEN which happens to be a good choice. This algorithm is known as bankers' rounding (see discussion here).
Another common strategy is HALF_UP which is more intuitive but has slightly worse statistical characteristics.
Also note that in many times (especially in banking and insurances) the rounding strategy will be dictated by business requirements, often different for various use-cases.