java 请问以下三个算式为什么会出现下面的结果,请逐一解答,谢谢!!!


int a = 1;
for (int i = 1; i <= 6; i++) {
    a = a * (50 - i + 1) / i;
}
System.out.println(a);            // result: 15890700


int b = 1;
for (int i = 1; i <= 6; i++) {   
    b *= (50 - i + 1) / i;
}
System.out.println(b);           // result: 13305600


int c = 1;
for (int i = 1; i <= 6; i++) {             
    c *= (double) (50 - i + 1) / i;
}
System.out.println(c);           // result: 15890700

运算的优先级不一样,在第一个例子加上一个大夸号,就和第二个结果一样了

int / int
是整除
3 / 2 = 1 而不是1.5

当i = 2时 会出现 49 / 2的行为,这里会少掉很多数值。

而第一种情况49要先乘a 也就是 50* 49 / 2 这个时候因为50是2的倍数 所以结果为正确的结果
3 是 48 /3 所以没事
4 是 47 / 4 但是 a能被4整除
...
总之这个循环 刚好a或者括号里的能被i整除,所以第一个结果和第三个结果一致
因为第三个 不是整除 而是将 (50 - i + 1) 转为浮点型,会出现小数
而c *= xx 相当于 c = (int) (c * xx)

由于乘法的交换律 所以第一个结果和第三个结果是一致的