gpt4 book ai didi

java - 带有 DecimalFormat 的 RoundingMode.UP 无法按预期工作

转载 作者:行者123 更新时间:2023-12-01 08:37:13 33 4
gpt4 key购买 nike

每当有十进制值时,我都试图四舍五入一个 Double 数字。我正在尝试以下。
以下代码段按预期四舍五入所有其他值。

1.08 -> 2
9.5 -> 10
但是将 0.08 舍入为 0 而不是 1。我在这里遗漏了什么吗?
DecimalFormat df = new DecimalFormat("0");
df.setRoundingMode(RoundingMode.UP);
Double number = 0.08;
System.out.println(df.format(number)); // expecting 1 but produces 0

number = 1.08;
System.out.println(df.format(number)); // correctly produces 2

最佳答案

这看起来像是bug JDK-8174722的体现,为 JDK8 报告,并且仍然以修复版本“tbd”打开(我在 JDK14 上看到相同的行为)。在那个错误报告中,四舍五入 0.0001少两位小数会导致 0.00而不是 0.01 .
我试图通过 DecimalFormat 的源代码来追踪这个计算。并发现对有效位数的多个假设,保留是为了兼容性,但显然是导致此类问题的原因。我基于源代码的预感是,如果请求的精度后的第一个数字是 0(或足够接近),则函数会向下舍入。这种行为与明确说明的文档相反。
如果它很容易修复,我认为链接的错误早就已经修复了,但它似乎也是一个低优先级。
正如评论所建议的,使用 Math.ceil() , Math.floor() , 和 Math.round()函数将提供更可预测/一致的结果,足以满足大多数用例。
在您的评论中,您建议用户提供 RoundingMode ,所以如果你想直接应用那个枚举,bug report's MCVE包括使用 BigDecimal.setScale() 的解决方法. @Andreasthis comment 中发布了此解决方法的应用程序产生这个字符串:

// Note: this ignores Locale
BigDecimal.valueOf(number).setScale(0, RoundingMode.UP).toPlainString();
使用 DecimalFormat 的另一种选择将允许更改区域设置,并且将是:
df.format(BigDecimal.valueOf(number).setScale(0, RoundingMode.UP));
请注意,因为您将使用 setScale() 中的四舍五入您不需要也在 DecimalFormat 中使用它.

关于java - 带有 DecimalFormat 的 RoundingMode.UP 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207758/

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