C数学计算未按预期进行
我在程序中有以下内容(一个更大的函数的一部分,但这是相关的测试位): 基本上相当于:C数学计算未按预期进行,c,math,C,Math,我在程序中有以下内容(一个更大的函数的一部分,但这是相关的测试位): 基本上相当于: x = a + (a * (b / 100)) 其中a是给定的数字,b是百分比修饰符,x是结果(原始值加上原始值的百分比)。。。我希望这是有道理的 它给了我: Test: 100 我认为我头脑中的数学可能是错误的,但我已经检查了几个计算器,甚至我的IDE中的表达式计算器,它们都给了我第一个表达式的预期结果109 有人能告诉我这里缺少什么吗 谢谢。:) int测试=100+(100*(9/100)) 9/10
x = a + (a * (b / 100))
其中a是给定的数字,b是百分比修饰符,x是结果(原始值加上原始值的百分比)。。。我希望这是有道理的
它给了我:
Test: 100
我认为我头脑中的数学可能是错误的,但我已经检查了几个计算器,甚至我的IDE中的表达式计算器,它们都给了我第一个表达式的预期结果109
有人能告诉我这里缺少什么吗
谢谢。:) int测试=100+(100*(9/100))
9/100=0
0*100=0
100+0=1009/10的答案被截断为0,然后乘以100,再加上100。您使用的是整数数学 9/100=0 100+(100*(0)=100
您的计算器使用浮点数学,可以适当地处理小数。您使用整数除法,因此9/100为零,因此
test=100+0=100
替换
int test = 100 + (100 * (9 / 100));
与
使用整数除法执行9/100
;最接近.09
的整数是0
(并且0*100
仍然是0
)
首先进行乘法运算会得到900/100
,这会得到您期望的9
如果需要的精度超过整数精度,则可能需要使用浮点运算。您的错误是9/100被解释为整数除法,计算结果为0,而不是0.09
您可以编写9/100.0,或者重新排列表达式。正如其他人所指出的,问题是您正在执行整数算术。您需要通过将变量转换为双精度或使用双精度常量,以浮点形式进行计算,然后允许截断,以仅给出整数部分
x = a + (a * (b / 100.0));
或
更改:
int test = 100 + (100 * (9 / 100));
到
看看它是否像预期的那样工作
编辑:哇。我打字的时候有很多答案。大多数答案也能用。你应该使用浮点运算,这样9/100就变成了0.09
int test=100.0+(100.0*9.0/100.0);如果只使用会产生整数值的表达式,请使用Daniel L的答案。如果要使用的值不太干净,请使用双文字而不是整数值:
int test = 100.0 + (100.0 * (9.0 / 100.0));
您正在为变量类型使用整数,因此最内部的表达式(9/100)将导致0。然后下一个表达式将是100*0,即0,最后是100+0 要获得所需的结果,请尝试改用float: 浮动试验=100.0+(100.0*(9.0/100.0))
printf(“结果:%0.2f\n”,测试)只在整数中使用算术,你应该看到它是如何计算出结果的,例如,想想100以整数而不是分数的形式变成9的频率。我认为你最好进行显式转换或使用浮点常量,因为如果你重构,根据计算顺序可能会被破坏代码。放入显式强制转换至少会警告下一个程序员(可能是你)这需要是浮点。我不知道;我一直在做“先乘后除”的缩放(显然对于不会溢出的数字)长期以来,这对我来说似乎很自然;如果可以避免的话,我尽量不进入FP。我同意在这种情况下谨慎是明智的。@tvanfosson:如果有人改变了操作顺序,他们就是在改变代码的行为。没有人会这样做,并期望它以同样的方式工作。而且它不需要是浮点型的……是有时你需要整数数学,这看起来就是其中之一。
x = a + (a * ((double)b / 100)));
int test = 100 + (100 * (9 / 100));
int test = (int)(100 + (100 * (9 / 100.0)));
int test = 100.0 + (100.0 * (9.0 / 100.0));