java中的舍入问题

java中的舍入问题,java,Java,我正在使用math.round()进行四舍五入 代码如下: double value=0.145 Math.round( value* 100.0) / 100.0; 我的期望是它应该返回0.15,但它返回0.14 此外,如果值为0.055,则返回的是0.05,而不是0.06 我已经通过了链接 请具体告诉我为什么会发生这种情况 提前感谢。如果您打印value*100.0,您会发现这实际上并不像您预期的那样是14.5,但它接近14.4999999998(在我的jdk1.8.0_181上)。如你

我正在使用
math.round()
进行四舍五入

代码如下:

double value=0.145
Math.round( value* 100.0) / 100.0; 
我的期望是它应该返回
0.15
,但它返回
0.14

此外,如果值为
0.055
,则返回的是
0.05
,而不是
0.06
我已经通过了链接 请具体告诉我为什么会发生这种情况


提前感谢。

如果您打印
value*100.0
,您会发现这实际上并不像您预期的那样是14.5,但它接近14.4999999998(在我的jdk1.8.0_181上)。如你所见,最终结果是0.14

为什么会这样,这就是浮点运算应该如何工作的。当您有一个无法用二进制正确表示的值时,您将面临这个问题。我给的答案,提供了很好的信息,为什么会发生链接

编辑:更新1
正如马特所说,它实际上是
0.145
,不能用二进制正确表示。根据IEEE754双精度64位表示,它实际上是1.449999999990007992778374E-1,而不是0.145

如果您打印
value*100.0
,您会发现这实际上并不像您预期的那样是14.5,但它接近14.49999998(在我的jdk1.8.0_181上)。如你所见,最终结果是0.14

为什么会这样,这就是浮点运算应该如何工作的。当您有一个无法用二进制正确表示的值时,您将面临这个问题。我给的答案,提供了很好的信息,为什么会发生链接

编辑:更新1
正如马特所说,它实际上是
0.145
,不能用二进制正确表示。根据IEEE754双精度64位表示,它实际上是1.449999999990007992778374E-1,而不是0.145

你可以使用
Math.ceil(0.145)
来获得你想要的结果
0.15
你可以使用
Math.ceil(0.145)
来获得你想要的结果
0.15

并在四舍五入之前检查
值*100
是什么;在四舍五入之前检查
值*100
是什么:如果不清楚,14.5可以精确表示,但0.145不能。所以第一个
值小于0.145。谢谢你指出@matt。我已经更新了我的答案。如果不清楚,14.5可以准确表示,但0.145不能。所以第一个
值小于0.145。谢谢你指出@matt。我已经更新了我的答案。