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”。