0

我正在尝试对整数进行一些算术运算。问题是当我尝试进行除法以获得双倍结果时,结果始终为 0.00000000000000000000,即使对于 ((7 * 207) / 6790) 之类的东西显然不是这样。我已经尝试对公式进行类型转换,但我仍然得到相同的结果。

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

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

4 回答 4

3

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

int / int = int

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

int因此,在进行除法时,输出将下降到一个。

您想要做的是强制其中任何一个发生:

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

以上涉及自动扩大转换- 请注意,只有一个需要是浮点值。

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

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

请注意,强制转换(double)(int / int)不起作用,因为这首先进行整数除法(返回 a int,因此将值下限),然后才将结果强制转换为double(这与简单地尝试将其分配给 adouble没有任何铸造,就像你所做的那样)。

于 2013-02-22T10:26:33.083 回答
1

对于诸如((7 * 207) / 6790)result is 之类的表达式0,或者0.0如果您认为 in ,它肯定是正确的double

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

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

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

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

所有o12,o21numTokens都是整数,因此表达式被计算为整数,然后转换为浮点数,因为e11is double

这喜欢做

const double a_quarter = 1 / 4;

这只是同一问题的一个更简单的情况:首先计算表达式,然后将结果(整数0)转换为双精度并存储。这就是语言的工作方式。

解决方法是强制转换:

e11 = ((o12 * o21) / (double) numTokens);
于 2013-02-22T10:24:46.507 回答
0

您必须将这些数字转换为double除法之前。当您对结果执行除法时int,结果也是一个向零舍入的整数,例如1 / 2 == 0,但是1.0 / 2.0 == 0.5

于 2013-02-22T10:25:16.533 回答
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
于 2013-02-22T10:25:45.063 回答