如何在打印时添加长并保持精度

How to add a long and preserve precision when printing

如何保持 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);

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

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

"秒 + micro_of_second:" + "1637208584" + "795307"

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

来完成此操作
System.out.println("seconds + micro_of_second: " + (seconds + micro_of_second));

在 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) 相加,计算出 long1638003891.

如果我们想先添加两个 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)