在C中除以整数将值向下舍入/结果为零
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C中除以整数将值向下舍入/结果为零相关的知识,希望对你有一定的参考价值。
我正在尝试对整数进行一些算术运算。问题是当我试图进行除法得到一个双重结果时,结果总是0.00000000000000000000,即使这显然不适用于((7 * 207)/ 6790)。我尝试过类型转换公式,但我仍然得到相同的结果。
我做错了什么,我该如何解决?
int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000
无论实际值如何,以下情况均适用:
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
,因此将值放在底部)然后才将结果转换为double
(这与仅仅尝试将其分配给double
相同)没有任何铸造的((7 * 207) / 6790)
,就像你做的那样)。
对于像0
这样的表达式来说,结果是0.0
或double
,如果你认为在((7 * 207) / 6790.0)
中肯定是正确的。
表达式只有整数,因此它将被计算为整数乘法,后跟整数除法。
你需要转换为浮点类型来改变它,例如e11 = ((o12 * o21) / numTokens);
。
许多人似乎都希望赋值的右侧能够被目标变量的类型自动“调整”:这不是它的工作原理。转换结果,但这不会影响右侧表达式中的任何“内部”操作。在你的代码中:
o12
所有o21
,numTokens
和e11
都是整数,因此表达式被计算为整数,然后转换为浮点数,因为double
是const double a_quarter = 1 / 4;
。
这样做
0
这只是同一问题的一个更简单的情况:首先计算表达式,然后将结果(整数e11 = ((o12 * o21) / (double) numTokens);
)转换为double并存储。这就是语言的运作方式。
修复是施放:
double
你必须在分裂之前将这些数字投射到int
。当你对1 / 2 == 0
进行除法时,结果也是一个向零舍入的整数,例如1.0 / 2.0 == 0.5
,但1/4 == 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
以上是关于在C中除以整数将值向下舍入/结果为零的主要内容,如果未能解决你的问题,请参考以下文章