3

第一种方式:

   long mySeconds = milliseconds/ 1000;

第二种方式:

   double mySeconds = milliseconds * 1e-3d;

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

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

这两种方法会有什么不同?

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

4

2 回答 2

1

正如其他人所指出的那样,第一种方式会截断(在这种情况下有效地向下舍入),而第二种方式不会。所以如果milliseconds是 10999 那么第一种方式得到你10,第二种得到你10.999

这对第三行有什么影响?好吧,考虑 ifsomeDoubleSeconds = 0someDouble = 10.5。那么如果milliseconds是 10999,你mySeconds可能是 10 或者可能是 10.999,第三行的结果可能是 0 或者可能是 1。(因为 10/10.5 小于 1,并且会被强制转换为 0 int,并且 10.999/10.5 大于 1,并且将通过强制转换为 int 截断为 1)

于 2013-12-12T18:33:05.097 回答
0

第一个是整数除法,这意味着例如,如果您有

long mySeconds = 1234

除以 1000 后,您将得到 1。

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

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

浮点数到整数类型 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,并且这个整数值可以表示为 long,那么第一步的结果就是 long 值 V。

. 否则,如果这个整数值可以表示为 int,那么第一步的结果就是 int 值 V。

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

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

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

2)第二步:

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

. 如果 T 是 byte、char 或 short,则转换的结果是第一步的结果缩小转换为 T 类型(第 5.1.3 节)的结果。

顺便说一句,在 Java 标准库中有一种转换时间单位的好方法:java.util.concurrent.TimeUnit。

于 2013-12-12T18:02:57.487 回答