C数学计算结果与预期不符

4
我在一个程序中写了以下代码(这是一个较大函数的一部分,但以下是关键测试内容):
int test = 100 + (100 * (9 / 100));
sprintf (buf, "Test: %d\n\r", test);
display_to_pc (buf, player);

基本上,这意味着:
x = a + (a * (b / 100))

当a是一个给定的数字,b是一个百分比修饰符,x是结果(原始数值加上原始数值的百分比)... 我希望这样说得清楚。

它给了我:

Test: 100

我原以为我的脑子里的数学可能是错的,但我检查了几个计算器,甚至在我的IDE中使用了表达式求值器,它们都给出了预期结果109的第一个表达式。

有谁能告诉我我错过了什么吗?

非常感谢。 :)


只在整数内使用算术运算,你应该能够看到它是如何得出结果的,例如,想想 100 在整数意义下可以被 9 整除多少次,而不是分数。 - JB King
11个回答

14

替换

int test = 100 + (100 * (9 / 100));

使用

int test = 100 + (100 * 9 / 100);
// x = a + (a * b / 100)

这样做会按预期工作。9 / 100 使用整数除法进行; 最接近.09的整数是0(并且0 * 100仍然是0)。

首先进行乘法得到900 / 100,这给出了您期望的9

如果需要超过整数精度,则可能需要使用浮点数方法。


我认为最好进行显式转换或使用浮点常量,因为依赖于评估顺序可能会在重构代码时出现错误。至少通过进行显式转换,可以警告下一个程序员(可能是您自己)需要使用浮点数。 - tvanfosson
我不知道;我一直在做“先乘后除”的缩放(显然是针对不会溢出的数字),所以这对我来说似乎很自然;如果可以避免,我会尽量不涉及FP。我同意,在这种情况下谨慎是明智的。 - Daniel LeCheminant
@tvanfosson:如果有人更改操作顺序,他们就会更改代码的行为。没有人会这样做并期望它以相同的方式工作。而且它不需要是浮点数……有时您需要整数运算,而这似乎就是其中之一。 - rmeador

8

您正在使用整数运算。

9/100 = 0。

100 + (100 * (0) = 100。

您的计算器使用浮点数运算,可以适当处理小数。


4

正如其他人指出的那样,问题在于您正在进行整数运算。您需要通过将变量转换为double或使用double常量来进行浮点数计算,然后允许截断以仅获得整数部分。

x = a + (a * (b / 100.0));

或者
x = a + (a * ((double)b / 100)));

3

int test = 100 + (100 * (9 / 100));

9/100 = 0,因为两个整数相除只保留整数部分

0 * 100 = 0

100 + 0 = 100


3

你的错误在于9/100被解释为整数除法,结果为0而不是0.09。

你可以使用9/100.0代替,或者重新排列表达式。


2

您正在使用整数除法,因此9/100为零,因此test = 100 + 0 = 100


2

如果您将只使用会产生整数值的表达式,请使用Daniel L的答案。如果您要处理的值不太干净,请改用双精度字面量而不是整数字面量:

int test = 100.0 + (100.0 * (9.0 / 100.0));

1

更改:

int test = 100 + (100 * (9 / 100));

int test = (int)(100 + (100 * (9 / 100.0)));

并查看它是否按预期工作。

编辑:哇。我在打字的时候有很多答案。大部分都可以使用。


1

9除以10的答案被截断为0,然后将其乘以100,再加上100。


1

你应该使用浮点数算术,这样9/100就变成了0.09。

int test = 100.0 + (100.0 * 9.0 / 100.0);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接