java long Division两个值出乎意料的结果

时间:2018-05-04 11:23:15

标签: java output long-integer division primitive-types

public class LongDivision {

    public static void main(String[] args) {
        final long a = 24 * 60 * 60 * 1000 * 1000;
        final long b = 24 * 60 * 60 * 1000;

        System.out.println(a/b);
    }
}

此代码块的输出为:5为什么结果为5?

3 个答案:

答案 0 :(得分:3)

您的每个因素都是int,并且乘法会溢出。即使您已将结果声明为long,但中间产品全部为int,因为它们的因素为int s。

如果您将第一个因素声明为long(使用后缀L),它将按预期工作:

public static void main(String[] args) {
    final long a = 24L * 60 * 60 * 1000 * 1000;
    final long b = 24L * 60 * 60 * 1000;

    System.out.println(a/b);
}

答案 1 :(得分:1)

24 * 60 * 60 * 1000 * 1000溢出并导致500654080而不是预期的86400000000

24L * 60 * 60 * 1000 * 1000按预期工作。

答案 2 :(得分:0)

24*60*60*1000*1000 = 86,400,000,000。在Binary中,它是‭0001 0100 0001 1101 1101 0111 0110 0000 0000 0000。由于文字值是整数类型,因此只会采用32 LSB。溢出将被丢弃。因此值为0001 1101 1101 0111 0110 0000 0000 0000,小数为500,654,080。所以这将是你的价值。您的b值为86,400,000。没有溢出。所以现在500,654,080/86,400,000 = 5就是你得到的。

如果您想要正确解决问题,请将第一个文字声明为long,以便

a = 24L * 60 * 60 * 1000 * 1000

会给你预期的输出。