Java 这两种将毫秒转换为秒的方法有什么区别?

Java 这两种将毫秒转换为秒的方法有什么区别?,java,rounding,floating-point-precision,milliseconds,datetime-conversion,Java,Rounding,Floating Point Precision,Milliseconds,Datetime Conversion,第一种方式: long mySeconds = milliseconds/ 1000; 第二种方式: double mySeconds = milliseconds * 1e-3d; 此计算最终用于确定数组的索引,如下所示: int index = (int) ((someDoubleSeconds + mySeconds)/ someDouble); 这两种方法有什么区别 第一种方法是否会像地板功能一样将舍入到下一秒或截断 第一个是整数除法,这意味着如果 long myS

第一种方式:

   long mySeconds = milliseconds/ 1000;
第二种方式:

   double mySeconds = milliseconds * 1e-3d;
此计算最终用于确定数组的索引,如下所示:

  int index = (int) ((someDoubleSeconds + mySeconds)/ someDouble);
这两种方法有什么区别


第一种方法是否会像地板功能一样将
舍入到下一秒
或截断

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

long mySeconds = 1234
除以1000,得到1

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

第三种方法有点复杂,因为对整数进行了双舍入。请参阅java语言规范:

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

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

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

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

然后有两种情况:

。如果T是长的,并且这个整数值可以表示为长的,那么第一步的结果就是长值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.

正如其他人所指出的,第一种方法截断(在本例中,有效地向下舍入),第二种方法不截断。因此,如果
毫秒数
为10999,那么第一种方法得到
10
,第二种方法得到
10.999


这在第三行有什么不同?好吧,考虑一下<代码>函数0 = <代码> >代码>然后,如果
毫秒
为10999,则您的
mySeconds
可能为10或10.999,第三行的结果可能为0或1。(由于10/10.5小于1,转换为int会将其截断为0,10.999/10.5大于1,转换为int会将其截断为1)

将双精度转换为int的规则非常复杂——我隐约记得可能会有舍入。(但请注意,
(int)
cast的问题确实存在,而不是在之前。)但第一除法将截断小数秒,而不是整数。@HotLicks将双精度转换为int只会截断小数部分。@arshajii-我以前被这些规则愚弄过-不是每天都这样做,在依赖规范之前,我想先阅读一下规范。如何:
import static java.util.concurrent.TimeUnit.*;int seconds=seconds.convert(毫秒,毫秒)?没有第三条路。