DecimalFormat舍入模式:舍入0.165(HALF_EVEN)到2位小数舍入到0.17?

时间:2015-11-04 19:44:28

标签: java

以下是代码:

   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。 但是,如果我在小数点后面有超过1位数,那么该规则是如何应用的。我不明白。提前感谢您的时间。

1 个答案:

答案 0 :(得分:2)

舍入规则仍然正确应用,但最初并未显示。这显示为“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”。