这是一个简单的问题示例:
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.为什么?
这是因为评估顺序不同,整数数学向下舍入。有关较小数字的示例以显示该点。
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。