DecimalFormat舍入模式:将0.165(HALF_EVEN)舍入到小数点后两位,舍入为0.17?
问题描述:
下面是代码:DecimalFormat舍入模式:将0.165(HALF_EVEN)舍入到小数点后两位,舍入为0.17?
public static void main(String[] args) {
formatNumber("##.##", 0.125);
formatNumber("##.##", 0.165);
}
public static void formatNumber(String pattern, double value) {
formatter.applyPattern(pattern);
String formattedNumber = formatter.format(value);
System.out.println("Number:" + value + ", Pattern:" +
pattern + ", Formatted Number:" +
formattedNumber);
}
我得到这个输出。
Number:0.125, Pattern:##.##, Formatted Number:0,12
Number:0.165, Pattern:##.##, Formatted Number:0,17
我知道默认情况下它使用HALF_EVEN舍入模式。 例如,5.5将四舍五入为6,6.5至6. 但是,如果例如我在小数点后有多个数字,那么该规则是如何应用的。我不明白。在此先感谢您的时间。
答
舍入规则仍然正确应用,但它一开始并没有出现。这显示为“0.17”,因为0.165不能精确地表示为浮点数double
;该表示的价值略高于0.165。
数字0.125
可以精确地表示(2 -3),所以它正确地舍入到0.12
用于显示。
但是数字0.165
只显示它应该向下舍入。
System.out.println(Long.toHexString(Double.doubleToLongBits(0.165)));
十六进制表示是
3fc51eb851eb851f
尾数为在过去的13个十六进制数字,它建立的重复十六进制数“51eb8”,但最后十六进制位被向上舍入到“f”,所以浮点表示的值稍大于实际的数学数字0.165。正因为如此,它被显示为“0.17”。