gpt4 book ai didi

java - 即使显式设置,DecimalFormat 使用不正确的 RoundingMode

转载 作者:行者123 更新时间:2023-11-29 10:10:37 28 4
gpt4 key购买 nike

为什么这个 DecimalFormat 没有按预期使用 RoundingMode.HALF_UP 进行舍入,应该怎么做才能获得预期的输出?可以用 DecimalFormat 来完成吗?

DecimalFormat df = new DecimalFormat("0.0");

df.setRoundingMode(RoundingMode.HALF_UP);

df.format(0.05); // expecting 0.1, getting 0.1
df.format(0.15); // expecting 0.2, getting 0.1 << unexpected

df.format(0.06); // expecting 0.1, getting 0.0 << unexpected

我已经看到this question的答案了, 具体来说 this answer , 但它似乎只在四舍五入为整数时才有效。

我的JDK是8.0.110,我的JRE是8.0.730.2

最佳答案

(使用 Java 8 回答下面的问题。)

您看到的问题来自于在代码中指定“0.15”或“0.05”,当表示为 double 值时,它略小于 0.15。看看这个

DecimalFormat df = new DecimalFormat("#.#");

df.setRoundingMode(RoundingMode.HALF_UP);

BigDecimal bd = new BigDecimal(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(0.15)); // expecting 0.1, getting 0.1
bd = new BigDecimal(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(0.05));
bd = new BigDecimal(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(0.06));

这段代码的输出是

bd=0.1499999999999999944488848768742172978818416595458984375
0.1
bd=0.05000000000000000277555756156289135105907917022705078125
0.1
bd=0.059999999999999997779553950749686919152736663818359375
0.1

一个可能的解决方案(如果您绝对需要它以正确的方式四舍五入)是使用 BigDecimal.valueOf 来创建值。例如

BigDecimal bd = BigDecimal.valueOf(0.15);
System.out.println("bd=" + bd);
System.out.println(df.format(bd)); // expecting 0.1, getting 0.1
bd = BigDecimal.valueOf(0.05);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));
bd = BigDecimal.valueOf(0.06);
System.out.println("bd=" + bd);
System.out.println(df.format(bd));

现在会产生

bd=0.15
0.2
bd=0.05
0.1
bd=0.06
0.1

顺便说一句,正如 Scary Wombat 指出的那样,掩码设置为 0.0 而不是 #.# 将使 0.6 0。但我认为这是我开始查看时的后期编辑。使用#.#。

关于java - 即使显式设置,DecimalFormat 使用不正确的 RoundingMode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201146/

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