有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

如何在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

共 (2) 个答案

  1. # 1 楼答案

    在Java中,表达式从左到右求值。因此

    "seconds + micro_of_second: " + seconds + micro_of_second
    

    在语义上与相同

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

    表情

    "seconds + micro_of_second: " + seconds
    

    计算为String,其中秒("1637208584")的(基数10)String表示形式被附加到String "seconds + micro_of_second: "。导致String "seconds + micro_of_second: 1637208584"
    然后,将micro_of_second795307)的(基10)String-表示形式附加到String "seconds + micro_of_second: 1637208584"上,从而产生字符串seconds + micro_of_second: 1637208584795307

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

    如果我们想首先添加两个long,我们可以通过引入括号强制执行求值顺序:

    "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_casemicro_of_second->;microOfSecond)来编写

  2. # 2 楼答案

    这里的问题不在于它的精确性

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

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

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

    “秒+微秒:”+“1637208584”+“795307”

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

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