这是问题的一个简单示例: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。为什么?
2 回答
狐的传说
TA贡献1804条经验 获得超3个赞
这是因为评估顺序不同,并且整数数学向下舍入。例如,用较小的数字来说明这一点。
3 * (5 / 2) = 3 * (2) = 6
不带括号
3 * 5 / 2 = 15 / 2 = 7
运算是从左到右计算的,没有括号,当你到达除法语句时,你会丢失一些信息,因为整数不能包含小数。通常,您越早丢失此信息,最终结果就越不准确。
当年话下
TA贡献1890条经验 获得超9个赞
如果两个操作数都是整数类型,Java中的/操作符代表整数除法,意味着除法提示被丢弃。在您的情况下,结果之间的差异为 2,这意味着n/s.length()
操作提醒大于2 / a
且明显小于 1。因此,如果a * n/s.length()
此提醒被乘以a
并在答案中为您提供多余的 2。
添加回答
举报
0/150
提交
取消