我正在尝试对整数进行一些算术运算。问题是当我试图进行除法得到一个双重结果时,结果总是0.00000000000000000000,即使这显然不适用于((7 * 207)/ 6790)。我尝试过键入公式,但我仍然得到相同的结果。
我做错了什么,如何解决?
int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000
答案 0 :(得分:3)
无论实际值如何,以下内容均为:
int / int = int
输出不会自动转换为非int
类型。
因此,在进行除法时,输出将被置于int
。
你想要做的是强迫其中任何一件事发生:
double / int = double
float / int = float
int / double = double
int / float = float
以上涉及自动widening conversion - 请注意,只有一个需要是浮点值。
您可以通过以下方式执行此操作:
(double)
或(float)
以将其强制转换为相应的类型或double
或float
请注意,像(double)(int / int)
这样的强制转换不起作用,因为它首先执行整数除法(返回int
,然后将值置于其后),然后将结果转换为{{1 (这与简单地尝试将其分配给double
而不进行任何转换一样),就像你已经完成的那样。)
答案 1 :(得分:1)
对于((7 * 207) / 6790)
这样的表达式来说,结果为0
或0.0
,如果您在double
中进行思考,那肯定是正确的。
表达式只有整数,因此它将被计算为整数乘法,后跟整数除法。
你需要转换为浮点类型来改变它,例如((7 * 207) / 6790.0)
。
许多人似乎都希望通过目标变量的类型自动“调整”赋值的右侧:这不是它的工作原理。 结果已转换,但这不会影响右侧表达式中的任何“内部”操作。在您的代码中:
e11 = ((o12 * o21) / numTokens);
所有o12
,o21
和numTokens
都是整数,因此表达式被计算为整数,然后转换为浮点数,因为e11
是{{1} }。
这就像做
double
这只是同一问题的一个更简单的情况:表达式先计算 ,然后将结果(整数const double a_quarter = 1 / 4;
)转换为double并存储。这就是语言的运作方式。
解决方法是施放:
0
答案 2 :(得分:0)
您必须在分割前将这些数字转换为double
。当您在int
上执行除法时,结果也是一个舍入为零的整数,例如1 / 2 == 0
,但1.0 / 2.0 == 0.5
。
答案 3 :(得分:0)
如果操作数是整数,则C将执行整数运算。也就是1/4 == 0
。但是,如果强制操作数为double
,则算术将考虑小数部分。所以:
int a = 1;
int b = 4;
double c = 1.0
double d = a/b; // d == 0.0
double e = c/b; // e == 0.25
double f = (double)a/b; // f == 0.25