【问题标题】:Whats the difference in these two ways to convert milliseconds to seconds?这两种将毫秒转换为秒的方法有什么区别?
【发布时间】:2013-12-12 17:05:46
【问题描述】:

第一种方式:

   long mySeconds = milliseconds/ 1000;

第二种方式:

   double mySeconds = milliseconds * 1e-3d;

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

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

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

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

【问题讨论】:

  • 将 double 转换为 int 的规则非常复杂——我隐约记得可以进行舍入。 (但请注意,(int) 演员阵容确实很受欢迎,而不是之前。)
  • 但是第一个除法会截断小数秒,而不是四舍五入。
  • @HotLicks 将 double 转换为 int 只会截断小数部分。
  • @arshajii - 我以前被这些规则愚弄过 - 不是每天都这样做,我想在依赖它之前阅读规范。
  • 怎么样:import static java.util.concurrent.TimeUnit.*; int seconds = SECONDS.convert(millis, MILLISECONDS);

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


【解决方案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)

【讨论】:

    【解决方案2】:

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

    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。

    【讨论】:

    • 没有第三种方法。
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多