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

问题描述 投票:0回答:4

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

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

int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000
c floating-point precision floating-accuracy
4个回答
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,因此将值放在底部)然后才将结果转换为double(这与仅仅尝试将其分配给double相同)没有任何铸造的((7 * 207) / 6790),就像你做的那样)。


1
投票

对于像0这样的表达式来说,结果是0.0double,如果你认为在((7 * 207) / 6790.0)中肯定是正确的。

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

你需要转换为浮点类型来改变它,例如e11 = ((o12 * o21) / numTokens);

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

o12

所有o21numTokense11都是整数,因此表达式被计算为整数,然后转换为浮点数,因为doubleconst double a_quarter = 1 / 4;

这样做

0

这只是同一问题的一个更简单的情况:首先计算表达式,然后将结果(整数e11 = ((o12 * o21) / (double) numTokens); )转换为double并存储。这就是语言的运作方式。

修复是施放:

double

0
投票

你必须在分裂之前将这些数字投射到int。当你对1 / 2 == 0进行除法时,结果也是一个向零舍入的整数,例如1.0 / 2.0 == 0.5,但1/4 == 0


0
投票

如果操作数是整数,则C将执行整数运算。那就是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 ,则算术将考虑小数部分。所以:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.