使用 int 和 long 进行 Java 计算会返回带或不带括号的不同值。为什么?

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


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。为什么?


茅侃侃
浏览 137回答 2
2回答

狐的传说

这是因为评估顺序不同,并且整数数学向下舍入。例如,用较小的数字来说明这一点。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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java