Java 十进制向上取整的奇数结果

Java 十进制向上取整的奇数结果,java,floating-point,floating-point-conversion,Java,Floating Point,Floating Point Conversion,提供一个浮点值37.35我得到一个字符串37.3 这是我的密码 DecimalFormat format = new DecimalFormat(".0"); format.setRoundingMode(RoundingMode.HALF_UP); return format.format(37.35f); 我希望收到一个字符串37.4。我做错了什么 我认为这可能是因为传入了一个浮点,但是我没有选择接收的变量类型。即使浮动的实际表示为37.35002121505154也应向上取整 将此值格式

提供一个浮点值
37.35
我得到一个字符串
37.3

这是我的密码

DecimalFormat format = new DecimalFormat(".0");
format.setRoundingMode(RoundingMode.HALF_UP);
return format.format(37.35f);
我希望收到一个字符串
37.4
。我做错了什么

我认为这可能是因为传入了一个浮点,但是我没有选择接收的变量类型。即使
浮动
的实际表示为
37.35002121505154
也应向上取整


将此值格式化为字符串的整个要点是,我可以将其传递到
bigdecimic
,并获得准确的值,例如
37.4

37.35实际上更接近37.3,然后是37.4。您可以使用以下代码进行检查:

System.out.println(37.35f-37.3f);
System.out.println(37.4f-37.35f);
打印
0.049999237
0.05000305

对于
double
数据类型,结果是不同的


要解决这个问题,只需在数字上加一点增量。例如,0.01。

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

使用双精度解决了这个问题,但由于这是一个限制,我建议使用包装器:

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

请务必在Java中使用BigDecimal类!它有一个方法来取整并获得你想要的格式,比如字符串、双精度等。最重要的是,使用这个类时不要失去精度!