【发布时间】:2020-11-22 05:46:14
【问题描述】:
只要有十进制值,我就会尝试对 Double 数字进行四舍五入。我正在尝试以下。 下面的 sn-p 按预期四舍五入所有其他值。
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
【问题讨论】:
-
这不是问题的直接答案,但你有理由不使用
Math.ceil(...)吗? -
这很奇怪。似乎阈值是
number = 0.10;用于四舍五入。我试过number = 0.0999999999999999;,但它给了0。 -
我们需要根据用户的输入来配置舍入模式。我认为使用 DecimalFormat 的 setRoundingMode 应该是一个更好的选择,因为我可以直接传递用户的选择,而不是为每种模式实现不同的逻辑。我在测试时发现了这个问题,并想了解我是否缺少某些东西
-
将其报告为错误。这不可能是正确的行为。
-
解决方法: 使用
BigDecimal.valueOf(number).setScale(0, RoundingMode.UP).toPlainString()--- 这会忽略Locale。