如何在打印时添加长并保持精度
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);
此行将 seconds
和 micro_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
) 相加,计算出 long
值 1638003891
.
如果我们想先添加两个 long
s,我们可以通过引入括号来强制计算顺序:
"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)
顺便说一句:在Java中,变量名应该写成camelCase
而不是snake_case
(micro_of_second
-> microOfSecond
)
如何保持 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);
此行将 seconds
和 micro_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
) 相加,计算出 long
值 1638003891
.
如果我们想先添加两个 long
s,我们可以通过引入括号来强制计算顺序:
"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)
顺便说一句:在Java中,变量名应该写成camelCase
而不是snake_case
(micro_of_second
-> microOfSecond
)