带有int和long的Java计算返回带或不带括号的不同值。为什么?

时间:2019-03-08 14:51:34

标签: java int long-integer

这是问题的一个简单示例:

public class IntVsLong {

    public static void main(String[] args) {
        int a = 3;
        int b = 3;
        long n = 549382313570L;
        String s = "epsxyyflvrrrxzvnoenvpegvuonodjoxfwdmcvwctmekpsnamchznsoxaklzjgrqruyzavshfbmuhdwwmpbkwcuomqhiyvuztwvq";

        System.out.println(a * n/s.length() + b); //returns 16481469410
        System.out.println(a * (n/s.length()) + b); //returns 16481469408
    }

}

第一个不带括号的情况返回16481469410。第二个带括号的情况返回16481469408。为什么?

2 个答案:

答案 0 :(得分:5)

这是因为求值顺序不同,并且整数数学取整。例如,用较小的数字来显示点。

3 * (5 / 2) = 3 * (2) = 6

没有括号

3 * 5 / 2 = 15 / 2 = 7

运算是从左到右无括号地求值的,当您到达除法语句时,由于整数不能保存小数,您会丢失一些信息。一般而言,您越早丢失此信息 ,最终结果的准确性就越低。

答案 1 :(得分:1)

如果两个操作数均为整数类型,则Java中的/运算符表示整数除法,这意味着除法除数提醒。在您的情况下,结果之间的差异为2,这意味着n/s.length()操作的提醒大于2 / a且明显小于1。因此,在a * n/s.length()情况下,此提醒与{{1 }},并为您提供答案中多余的2。