Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C数学计算未按预期进行_C_Math - Fatal编程技术网

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=100

9/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));