【问题标题】:How to add a long and preserve precision when printing打印时如何添加长并保持精度
【发布时间】:2021-11-18 19:11:25
【问题描述】:

如何在sum 输出中保持精度。我认为正在发生的事情是精度完全相同,但是一个选项选择舍入。

public class Main {
    public static void main(String[] args) {
        final long seconds = 1637208584L;
        final long micro_of_second = 795307;
        final long sum = seconds + micro_of_second;
        System.out.println("seconds + micro_of_second: " + seconds + micro_of_second);
        System.out.println("sum:                       " + sum);
        System.out.println("equal?:                    " + (sum == seconds + micro_of_second));
    }
}

输出

seconds + micro_of_second: 1637208584795307
sum:                       1638003891
equal?:                    true

【问题讨论】:

  • "System.out.println("seconds + micro_of_second: " + seconds + micro_of_second);" - 你觉得这条线是做什么的?
  • 顺便说一下,将日期时间作为一个纪元引用的计数来跟踪是容易出错的,并且本质上是模棱两可的,因此难以调试。我建议您改用 java.time 类中的对象,并以标准 ISO 8601 格式序列化为文本。这已在 Stack Overflow 上得到广泛解决,因此请搜索以了解更多信息。 Instant.ofEpochSecond( 1_637_208_584L ).plus( 795_307L , ChronoUnit.MICROS ).toString()2021-11-18T04:09:44.795307Z

标签: java long-integer


【解决方案1】:

这里的问题不在于行的精确度

System.out.println("seconds + micro_of_second: " + seconds + micro_of_second);

此行将secondsmicro_of_second 隐式转换为字符串并将它们连接在一起。

所以你看到的结果实际上是:

“秒 + micro_of_second:” + “1637208584” + “795307”

您要做的是在将整数加法添加到字符串之前对其进行评估。您可以通过将该行更改为

System.out.println("seconds + micro_of_second: " + (seconds + micro_of_second));

【讨论】:

    【解决方案2】:

    在 Java 中,表达式是从左到右计算的。因此

    "seconds + micro_of_second: " + seconds + micro_of_second
    

    语义相同

    ("seconds + micro_of_second: " + seconds) + micro_of_second
    

    表达式

    "seconds + micro_of_second: " + seconds
    

    计算为 String,其中(以 10 为基数)String-秒表示 ("1637208584") 附加到 String "seconds + micro_of_second: "。导致String "seconds + micro_of_second: 1637208584"
    然后,micro_of_second (795307) 的(以 10 为基数)String 表示附加到String "seconds + micro_of_second: 1637208584",得到字符串seconds + micro_of_second: 1637208584795307

    相比之下,seconds + micro_of_second 将两个值 (1637208584 + 795307) 相加,计算结果为 long-value 1638003891

    如果我们想先添加两个longs,我们可以通过引入括号来强制执行评估顺序:

    "seconds + micro_of_second: " + (seconds + micro_of_second)
    

    这将评估为String "seconds + micro_of_second: 1638003891"

    或者,如果我们想要得到总的微秒数,我们需要在加上micro_of_second 之前将seconds 的值乘以1_000_000L(因为一秒钟内有1_000_000 微秒):

    "micros: " + (seconds * 1_000_000L + micro_of_second)
    

    Ideone demo


    顺便说一句:在 Java 中,变量名应该写成 camelCase 而不是 snake_case (micro_of_second -> microOfSecond)

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多