gpt4 book ai didi

java - DecimalFormat 舍入模式 : Rounding 0. 165 (HALF_EVEN) 到小数点后 2 位四舍五入到 0.17?

转载 作者:行者123 更新时间:2023-11-30 03:11:33 25 4
gpt4 key购买 nike

这是代码:

   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 位,则如何应用该规则。我不明白。预先感谢您的宝贵时间。

最佳答案

舍入规则仍然正确应用,但一开始看起来并非如此。显示为“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”。

关于java - DecimalFormat 舍入模式 : Rounding 0. 165 (HALF_EVEN) 到小数点后 2 位四舍五入到 0.17?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com