2017-02-23 48 views
1

供应的37.35一个浮点值,我得到的37.3奇结果从DecimalFormat的舍入半升

一个字符串这里是我的代码。

DecimalFormat format = new DecimalFormat(".0"); 
format.setRoundingMode(RoundingMode.HALF_UP); 
return format.format(37.35f); 

我期望收到一个字符串37.4。我究竟做错了什么?

我认为这可能是由于传递一个浮点数,但是我没有选择关于我接收的变量的类型。即使float的实际表示为37.3500221215051544,它仍应该向上舍入?

把这个值格式化为一个字符串的要点是我可以将它传递给BigDecimal并且具有确切的值,例如37.4

回答

1

37.35实际上更接近37.3然后更接近37.4。您可以检查它woth下面的代码:

System.out.println(37.35f-37.3f); 
System.out.println(37.4f-37.35f); 

在打印0.0499992370.05000305

double数据类型的结果是不同的。

要解决此问题,只需在您的号码中添加一点点增量。对于exapmle,0.01。

+0

请ü必须使用BigDecimal类在Java中!它有一个方法来收集和得到你想要的字符串,双等格式。而最重要的是,你不会放松使用这个类的精度! – Catluc

0

此问题是由于计算机的浮点运算中浮点数据类型的精度造成的。正如@Zefick在他的回答中所显示的那样,37.35像浮点的表示实际上更接近37.3而不是37.4;因为它略低于37.35。

采用双精度解决了这个问题,但作为这个我建议使用一个包装的限制:

return format.format(Double.valueOf(String.valueOf(37.35f)));