我的目标是计算出 counter 由于 cap 是。现在我查了一道题,找不出下面两个公式的区别,就我的数学理解来说,是完全一样的计算。但只有第一个有效,括号没有区别。int i = counter * 100 / cap; //works int i = counter / cap * 100; //doesn't work 这与java有关吗?还是只有我犯了一个可怕的思维错误?
counter
cap
int i = counter / cap * 100; //doesn't work
qmelpv7a1#
你的错误是假设这些只是纯粹的,抽象的数字。我想 counter 是一个 int ... 因此,第二个版本的评估为:
int
int tmp = counter / cap; int i = tmp * 100;
现在我们讨论的是整数运算-如果 counter 例如,在范围[-99,99]内, tmp 将为0。请注意,即使是您的第一个版本也可能无法工作,如果 counter 非常大,乘以100可能会超出 int ,导致负面结果。不过,这可能是你最好的方法,如果 counter 预计在更合理的范围内。当然,即使使用浮点运算,您仍然无法获得“纯”数字的行为-在范围和精度方面仍然存在限制。
tmp
ki0zmccv2#
它不是相同的计算,因为您处理的是整数算术,它不是所有数字都有乘法倒数(只有1有它)。例如,在整数算术中, 1/2 == 0 ,而不是 0.5 -就像在实数算术中一样。这当然会导致以后相乘时的不一致性。如前所述,其根源在于整数算术的行为与实数算术不同,尤其是除法运算符没有定义为实数 a/b == a*b^-1 ,自 b^-1 在整数算术中甚至没有定义除1以外的所有数字。
1/2 == 0
0.5
a/b == a*b^-1
b^-1
ivqmmu1c3#
第一个案例
int i = counter * 100 / cap;
评估如下
(counter * 100) / cap;
第二种情况
int i = counter / cap * 100;
是这样的吗
(counter / cap) * 100
因此结果不同
xdyibdwo4#
在java中,运算符和/具有相同的优先级,因此表达式按顺序求值。即计数器100/盖-->(计数器100)/盖计数器/盖100-->(计数器/盖)100因此,对于值,例如counter=5,cap=25(期望count和cap都是int变量),计算是在第一种情况下:5100=500,然后500/25=20在第二种情况下,求值为:5/25=0(整数数学!),那么0*100=0。
4条答案
按热度按时间qmelpv7a1#
你的错误是假设这些只是纯粹的,抽象的数字。我想
counter
是一个int
... 因此,第二个版本的评估为:现在我们讨论的是整数运算-如果
counter
例如,在范围[-99,99]内,tmp
将为0。请注意,即使是您的第一个版本也可能无法工作,如果
counter
非常大,乘以100可能会超出int
,导致负面结果。不过,这可能是你最好的方法,如果counter
预计在更合理的范围内。当然,即使使用浮点运算,您仍然无法获得“纯”数字的行为-在范围和精度方面仍然存在限制。
ki0zmccv2#
它不是相同的计算,因为您处理的是整数算术,它不是所有数字都有乘法倒数(只有1有它)。
例如,在整数算术中,
1/2 == 0
,而不是0.5
-就像在实数算术中一样。这当然会导致以后相乘时的不一致性。如前所述,其根源在于整数算术的行为与实数算术不同,尤其是除法运算符没有定义为实数
a/b == a*b^-1
,自b^-1
在整数算术中甚至没有定义除1以外的所有数字。ivqmmu1c3#
第一个案例
评估如下
第二种情况
是这样的吗
因此结果不同
xdyibdwo4#
在java中,运算符和/具有相同的优先级,因此表达式按顺序求值。即
计数器100/盖-->(计数器100)/盖
计数器/盖100-->(计数器/盖)100
因此,对于值,例如counter=5,cap=25(期望count和cap都是int变量),计算是在第一种情况下:5100=500,然后500/25=20
在第二种情况下,求值为:5/25=0(整数数学!),那么0*100=0。