这两种方式将毫秒转换为秒的区别是什么?

时间:2013-12-12 17:05:46

标签: java rounding floating-point-precision milliseconds datetime-conversion

第一种方式:

   long mySeconds = milliseconds/ 1000;

第二种方式:

   double mySeconds = milliseconds * 1e-3d;

此计算最终用于确定数组的索引,如下所示:

  int index = (int) ((someDoubleSeconds + mySeconds)/ someDouble);

这两种方法有何不同?

第一种方法rounds to the next second还是截断like floor function

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样,第一种方式是截断(向下舍入,有效地,在这种情况下),第二种方式不是。因此,如果milliseconds为10999,则第一种方式会让您10,第二种方式会让您10.999

这在第三行有什么不同?好吧,考虑someDoubleSeconds = 0someDouble = 10.5。然后如果milliseconds是10999,那么mySeconds可以是10或者可以是10.999,第三行的结果可以是0或者它可以是1.(因为10 / 10.5小于1,并且会被强制转换为0,并且10.999 / 10.5大于1,并且会被强制转换为1,并被强制转换为1)

答案 1 :(得分:0)

fisrt one是整数除法,这意味着例如,如果你有

long mySeconds = 1234
除以1000之后,你将得到1。

第二种方式会给你一个准确的双倍,我认为你不想要。一秒钟半适合你吗?

由于双舍入到整数,第三种方式有点复杂。请参阅java lang规范:

  

将浮点数转换为整数类型T需要两个步骤:

     

1)在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:

     

。如果浮点数为NaN(§4.2.3),则转换的第一步结果为int或long 0。

     

。否则,如果浮点数不是无穷大,则浮点值将四舍五入为整数值V,使用IEEE 754舍入为零的模式(第4.2.3节)向零舍入。

     

然后有两种情况:

     

。如果T很长,并且这个整数值可以表示为long,那么第一步的结果就是长值V.

     

。否则,如果此整数值可以表示为int,则第一步的结果是int值V.

     

。否则,以下两种情况之一必须为真:

     

。该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。

     

。该值必须太大(大幅度或正无穷大的正值),第一步的结果是int或long类型的最大可表示值。

     

2)第二步:

     

。如果T为int或long,则转换结果是第一步的结果。

     

。如果T是byte,char或short,则转换的结果是第一步结果的类型T(第5.1.3节)的转换变窄的结果。

BTW有一种很好的方法可以在Java标准库中转换时间单位: java.util.concurrent.TimeUnit中。