这是问题的一个简单示例:
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。为什么?
答案 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。