这两种把毫秒转换成秒的方式有什么区别?

3

第一种方法:

   long mySeconds = milliseconds/ 1000;

第二种方法:
   double mySeconds = milliseconds * 1e-3d;

这个计算最终用来确定数组的索引,如下所示:
  int index = (int) ((someDoubleSeconds + mySeconds)/ someDouble);

这两种方法有什么区别?

第一种方法是否会向下取整,还是四舍五入到下一秒


将double转换为int的规则有些复杂--我模糊地记得可能会四舍五入。(但请注意,这个问题真正影响的是(int)强制转换,而不是之前的操作。) - Hot Licks
但是第一次除法将截断小数秒,而不是四舍五入。 - Hot Licks
1
@HotLicks 将 double 强制转换为 int 只是简单地截断小数部分。 - arshajii
@assylias TimeUnit 通过除以1000L来完成相同的除法运算。 - user1071840
整数除法和强制转换为整数类型会像“floor”函数一样向下舍入,而不是四舍五入到最近的整数。 - Tim S.
显示剩余2条评论
2个回答

1

正如其他人所指出的,第一种方法会截断(在这种情况下实际上是向下取整),而第二种方法则不会。因此,如果milliseconds为10999,则第一种方法可以得到10,而第二种方法可以得到10.999

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


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。
. 否则,如果浮点数不是无穷大,则使用 IEEE 754 舍入向零模式(§4.2.3)将浮点值四舍五入为整数值V。
然后有两种情况:
. 如果T是long,并且此整数值可以表示为long,则第一步的结果是long值V。
. 否则,如果此整数值可以表示为int,则第一步的结果是int值V。
. 否则,以下两种情况之一必须为真:
. 值太小(大幅度的负值或负无穷大),第一步的结果是int或long类型的最小可表示值。
. 值太大(大幅度的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。
2) 第二步:
. 如果T是int或long,则转换的结果是第一步的结果。
. 如果T是byte、char或short,则转换的结果是对第一步结果进行缩小转换(§5.1.3)的类型T的结果。

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


没有第三种方式。 - user1071840

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接