以下是解压缩的代码:
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的书中遇到过与此类似的东西,但已经忘记了。谁能告诉我为什么会发生这种情况(以及适当的术语/错误)?
感谢。
答案 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);