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

问题描述 投票:-1回答:2

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

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

java int long-integer
2个回答
5
投票

这是因为评估顺序不同,整数数学向下舍入。有关较小数字的示例以显示该点。

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

没有括号

3 * 5 / 2 = 15 / 2 = 7

操作从左到右进行评估,没有括号,当你到达除法语句时,你会丢失一些信息,因为整数不能包含小数。一般而言,您丢失此信息越早,您的最终结果就越不准确。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.