相同的计算,不同的结果?

hec6srdp  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(331)

我的目标是计算出 counter 由于 cap 是。现在我查了一道题,找不出下面两个公式的区别,就我的数学理解来说,是完全一样的计算。但只有第一个有效,括号没有区别。
int i = counter * 100 / cap; //works int i = counter / cap * 100; //doesn't work 这与java有关吗?还是只有我犯了一个可怕的思维错误?

qmelpv7a

qmelpv7a1#

你的错误是假设这些只是纯粹的,抽象的数字。我想 counter 是一个 int ... 因此,第二个版本的评估为:

int tmp = counter / cap;
int i = tmp * 100;

现在我们讨论的是整数运算-如果 counter 例如,在范围[-99,99]内, tmp 将为0。
请注意,即使是您的第一个版本也可能无法工作,如果 counter 非常大,乘以100可能会超出 int ,导致负面结果。不过,这可能是你最好的方法,如果 counter 预计在更合理的范围内。
当然,即使使用浮点运算,您仍然无法获得“纯”数字的行为-在范围和精度方面仍然存在限制。

ki0zmccv

ki0zmccv2#

它不是相同的计算,因为您处理的是整数算术,它不是所有数字都有乘法倒数(只有1有它)。
例如,在整数算术中, 1/2 == 0 ,而不是 0.5 -就像在实数算术中一样。这当然会导致以后相乘时的不一致性。
如前所述,其根源在于整数算术的行为与实数算术不同,尤其是除法运算符没有定义为实数 a/b == a*b^-1 ,自 b^-1 在整数算术中甚至没有定义除1以外的所有数字。

ivqmmu1c

ivqmmu1c3#

第一个案例

int i = counter * 100 / cap;

评估如下

(counter * 100) / cap;

第二种情况

int i = counter / cap * 100;

是这样的吗

(counter / cap) * 100

因此结果不同

xdyibdwo

xdyibdwo4#

在java中,运算符和/具有相同的优先级,因此表达式按顺序求值。即
计数器
100/盖-->(计数器100)/盖
计数器/盖
100-->(计数器/盖)100
因此,对于值,例如counter=5,cap=25(期望count和cap都是int变量),计算是在第一种情况下:5
100=500,然后500/25=20
在第二种情况下,求值为:5/25=0(整数数学!),那么0*100=0。

相关问题