DecimalFormat 四舍五入的奇数结果
Odd result From DecimalFormat Rounding Half Up
提供 37.35
的浮点值 我得到 37.3
的字符串
这是我的代码。
DecimalFormat format = new DecimalFormat(".0");
format.setRoundingMode(RoundingMode.HALF_UP);
return format.format(37.35f);
我希望收到一串 37.4
。我做错了什么?
我认为这可能是由于传入了一个浮点数,但是我无法选择接收到的变量类型。即使 float
的实际表示是 37.3500221215051544
,它仍然应该四舍五入吗?
将此值格式化为字符串的全部意义在于我可以将其传递给 BigDecimal
并获得精确值,例如 37.4
.
37.35 实际上更接近 37.3,然后更接近 37.4。您可以通过以下代码检查它:
System.out.println(37.35f-37.3f);
System.out.println(37.4f-37.35f);
in 打印 0.049999237
和 0.05000305
.
对于 double
数据类型,结果不同。
要解决此问题,只需在您的数字中添加一点增量即可。例如,0.01.
这个问题是由于计算机浮点运算中float数据类型的精度问题。正如@Zefick 在他的回答中所展示的那样,像 float 这样的 37.35 的表示实际上更接近 37.3 而不是 37.4;因为略低于37.35.
使用双精度解决了这个问题,但作为一个限制,我建议使用包装器:
return format.format(Double.valueOf(String.valueOf(37.35f)));
提供 37.35
的浮点值 我得到 37.3
这是我的代码。
DecimalFormat format = new DecimalFormat(".0");
format.setRoundingMode(RoundingMode.HALF_UP);
return format.format(37.35f);
我希望收到一串 37.4
。我做错了什么?
我认为这可能是由于传入了一个浮点数,但是我无法选择接收到的变量类型。即使 float
的实际表示是 37.3500221215051544
,它仍然应该四舍五入吗?
将此值格式化为字符串的全部意义在于我可以将其传递给 BigDecimal
并获得精确值,例如 37.4
.
37.35 实际上更接近 37.3,然后更接近 37.4。您可以通过以下代码检查它:
System.out.println(37.35f-37.3f);
System.out.println(37.4f-37.35f);
in 打印 0.049999237
和 0.05000305
.
对于 double
数据类型,结果不同。
要解决此问题,只需在您的数字中添加一点增量即可。例如,0.01.
这个问题是由于计算机浮点运算中float数据类型的精度问题。正如@Zefick 在他的回答中所展示的那样,像 float 这样的 37.35 的表示实际上更接近 37.3 而不是 37.4;因为略低于37.35.
使用双精度解决了这个问题,但作为一个限制,我建议使用包装器:
return format.format(Double.valueOf(String.valueOf(37.35f)));