Java 使用整数和长整数计算 returns 带或不带括号的不同值。为什么?

Java calculation with ints and longs returns different values with or without parentheses. Why?

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

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
    }

}

第一种情况,不带括号,returns16481469410。第二种,带括号,returns16481469408。为什么?

这是因为求值顺序不同,整数数学四舍五入。以较小的数字为例来说明这一点。

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

没有括号

3 * 5 / 2 = 15 / 2 = 7

运算是从左到右计算的,没有括号,当你到达除法语句时,你会丢失一些信息,因为整数不能包含小数。您丢失此信息的时间越早通常您的最终结果就越不准确。

如果两个操作数都是整数类型,Java中的/运算符表示整数除法,即舍弃除法提醒。在您的情况下,结果之间的差异为 2,这意味着 n/s.length() 操作的提醒大于 2 / a 并且显然小于 1。因此,在 a * n/s.length() 的情况下,此提醒乘以 a 并在答案中给你多余的 2。