Java 十进制四舍五入模式:将0.165(半偶数)四舍五入到小数点后2位,四舍五入到0.17?

Java 十进制四舍五入模式:将0.165(半偶数)四舍五入到小数点后2位,四舍五入到0.17?,java,Java,代码如下: public static void main(String[] args) { formatNumber("##.##", 0.125); formatNumber("##.##", 0.165); } public static void formatNumber(String pattern, double value) { formatter.applyPattern(pattern);

代码如下:

   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
我知道默认情况下它使用半偶数舍入模式。 例如,5.5四舍五入为6,6.5四舍五入为6。
但是,如果我在小数点后有超过1个数字,那么这个规则是如何应用的呢。我不明白。提前感谢您的时间。

四舍五入规则仍然正确应用,但一开始看起来并非如此。这显示为“0.17”,因为0.165不能精确表示为浮点
双精度
;表示的值略高于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”