Seems that it's intended change. The JDK 1.7 behavior was incorrect.
The problem is that you simply cannot represent the number 10.55555
using the double
type. It stores the data in IEEE binary format, so when you assign the decimal 10.55555
number to the double
variable, you actually get the closest value which can be represented in IEEE format: 10.555550000000000210320649784989655017852783203125
. This number is bigger than 10.55555
, so it's correctly rounded to 10.5556
in HALF_DOWN
mode.
You can check some numbers which can be exactly represented in binary. For example, 10.15625
(which is 10 + 5/32
, thus 1010.00101
in binary). This number is rounded to 10.1562
in HALF_DOWN
mode and 10.1563
in HALF_UP
mode.
If you want to restore the old behavior, you can first convert your number to BigDecimal
using BigDecimal.valueOf
constructor, which "translates a double
into a BigDecimal
, using the double
's canonical string representation":
BigDecimal toFormat = BigDecimal.valueOf(10.55555);
System.out.println("Round down");
System.out.println(format.format(toFormat)); // 10.5555
format.setRoundingMode(RoundingMode.HALF_UP);
toFormat = BigDecimal.valueOf(10.55555);
System.out.println("Round up");
System.out.println(format.format(toFormat)); // 10.5556
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…