在C中除以整数将值向下舍入/结果为零

时间:2013-02-22 10:21:41

标签: c floating-point precision floating-accuracy

我正在尝试对整数进行一些算术运算。问题是当我试图进行除法得到一个双重结果时,结果总是0.00000000000000000000,即使这显然不适用于((7 * 207)/ 6790)。我尝试过键入公式,但我仍然得到相同的结果。

我做错了什么,如何解决?

int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000

4 个答案:

答案 0 :(得分:3)

无论实际值如何,以下内容均为:

int / int = int

输出不会自动转换为非int类型。

因此,在进行除法时,输出将被置于int

你想要做的是强迫其中任何一件事发生:

double / int = double
float / int = float
int / double = double
int / float = float

以上涉及自动widening conversion - 请注意,只有一个需要是浮点值。

您可以通过以下方式执行此操作:

  • 在您的某个值之前加上(double)(float)以将其强制转换为相应的类型或
  • 将一个或多个变量更改为doublefloat

请注意,像(double)(int / int)这样的强制转换不起作用,因为它首先执行整数除法(返回int,然后将值置于其后),然后将结果转换为{{1 (这与简单地尝试将其分配给double而不进行任何转换一样),就像你已经完成的那样。)

答案 1 :(得分:1)

对于((7 * 207) / 6790)这样的表达式来说,结果为00.0,如果您在double中进行思考,那肯定是正确的。

表达式只有整数,因此它将被计算为整数乘法,后跟整数除法。

你需要转换为浮点类型来改变它,例如((7 * 207) / 6790.0)

许多人似乎都希望通过目标变量的类型自动“调整”赋值的右侧:这不是它的工作原理。 结果已转换,但这不会影响右侧表达式中的任何“内部”操作。在您的代码中:

e11 = ((o12 * o21) / numTokens);

所有o12o21numTokens都是整数,因此表达式被计算为整数,然后转换为浮点数,因为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