java给出.9999999而不是舍入的整数

时间:2013-12-04 20:49:24

标签: java double divide

以下是解压缩的代码:

long timeMs = 1473;
double timeS = (timeMs / 1000) + (timeMs% 1000) / 1000.0;
System.out.println(timeS);

输出是:

1.4729999999999999

所以基本上,我只是试图将以秒为单位的时间转换为毫秒。 在我看到这个之后我认为我的方法是错误的,所以我尝试了其他输入,例如1472,1474,1173,3等都给出了正确的值(1.472,1.474,1.173,0.003)。

我想我刚才在一本名为Java Puzzlers的书中遇到过与此类似的东西,但已经忘记了。谁能告诉我为什么会发生这种情况(以及适当的术语/错误)?

感谢。

2 个答案:

答案 0 :(得分:3)

请改用它,但这是因为IEEE 754舍入规则。

double timeS = (timeMs / 1000.0); //+ ((double) (timeMs % 1000) / 1000.0);

答案 1 :(得分:0)

使用BigDecimal进行更精确的舍入和缩放。

   long timeMs = 1473;
   double timeS = (timeMs / 1000d);
   BigDecimal usefulName = new BigDecimal(timeS).setScale(3, RoundingMode.HALF_UP);
   System.out.println(usefulName);