似乎是有意更改。JDK 1.7行为不正确。
问题是您根本
无法
10.55555使用
double类型来表示数字。它以IEEE二进制格式存储数据,因此,当您
10.55555为
double变量分配十进制数时,实际上会获得可以用IEEE格式表示的最接近的值:
10.555550000000000210320649784989655017852783203125。此数字大于
10.55555,因此
10.5556在
HALF_DOWN模式下正确舍入为。
您可以检查一些可以用二进制精确表示的数字。例如,
10.15625(为
10 +5/32,因此
1010.00101为二进制)。这个数字四舍五入到
10.1562的
HALF_DOWN模式,
10.1563在
HALF_UP模式。
如果要恢复旧的行为,可以先将数字转换为
BigDecimalusing
BigDecimal.valueOf构造函数,该构造函数“ 使用’的规范字符串表示形式将a
double转换为a ”:
BigDecimal``double
BigDecimal toFormat = BigDecimal.valueOf(10.55555);System.out.println("Round down");System.out.println(format.format(toFormat)); // 10.5555format.setRoundingMode(RoundingMode.HALF_UP);toFormat = BigDecimal.valueOf(10.55555);System.out.println("Round up");System.out.println(format.format(toFormat)); // 10.5556


