用C除以整数将值向下舍入/结果为零
我想对整数做一些算术运算。问题是当我试图除法得到一个双精度的结果时,结果总是0.00000000000000,尽管这对于((7*207)/6790)之类的东西显然是不正确的。我已经尝试过对公式进行类型转换,但仍然得到相同的结果 我做错了什么?我该如何修复它用C除以整数将值向下舍入/结果为零,c,floating-point,precision,floating-accuracy,C,Floating Point,Precision,Floating Accuracy,我想对整数做一些算术运算。问题是当我试图除法得到一个双精度的结果时,结果总是0.00000000000000,尽管这对于((7*207)/6790)之类的东西显然是不正确的。我已经尝试过对公式进行类型转换,但仍然得到相同的结果 我做错了什么?我该如何修复它 int o12 = 7, o21 = 207, numTokens = 6790; double e11 = ((o12 * o21) / numTokens); printf(".%20lf", e11); // prints 0.0000
int o12 = 7, o21 = 207, numTokens = 6790;
double e11 = ((o12 * o21) / numTokens);
printf(".%20lf", e11); // prints 0.00000000000000000000
对于像
((7*207)/6790)
这样的表达式,其结果肯定是0
,或者0.0
,如果您使用double
表达式只有整数,因此它将被计算为整数乘法和整数除法
您需要强制转换为浮点类型才能更改,例如((7*207)/6790.0)
许多人似乎期望赋值的右侧会根据目标变量的类型自动“调整”:这不是它的工作方式。结果将被转换,但这不会影响右侧表达式中的任何“内部”操作。在代码中:
e11 = ((o12 * o21) / numTokens);
所有o12
、o21
和numTokens
都是整数,因此表达式计算为整数,然后转换为浮点,因为e11
是双精度的
我喜欢这样做
const double a_quarter = 1 / 4;
这只是同一问题的一个简单例子:首先计算表达式,然后将结果(整数0
)转换为double并存储。这就是语言的工作原理
解决方案是:
e11 = ((o12 * o21) / (double) numTokens);
对于像((7*207)/6790)
这样的表达式,其结果肯定是0
,或者0.0
,如果您使用double
表达式只有整数,因此它将被计算为整数乘法和整数除法
您需要强制转换为浮点类型才能更改,例如((7*207)/6790.0)
许多人似乎期望赋值的右侧会根据目标变量的类型自动“调整”:这不是它的工作方式。结果将被转换,但这不会影响右侧表达式中的任何“内部”操作。在代码中:
e11 = ((o12 * o21) / numTokens);
所有o12
、o21
和numTokens
都是整数,因此表达式计算为整数,然后转换为浮点,因为e11
是双精度的
我喜欢这样做
const double a_quarter = 1 / 4;
这只是同一问题的一个简单例子:首先计算表达式,然后将结果(整数0
)转换为double并存储。这就是语言的工作原理
解决方案是:
e11 = ((o12 * o21) / (double) numTokens);
您必须在除法之前将这些数字转换为双倍。当您对int
执行除法时,结果也是一个向零舍入的整数,例如1/2==0
,但是1.0/2.0==0.5
必须在除法之前将这些数字转换为双精度
。对int
执行除法时,结果也是一个向零舍入的整数,例如1/2==0
,但是1.0/2.0==0.5
如果操作数是整数,C将执行整数算术。也就是说,1/4==0
。但是,如果强制操作数为双精度
,则算术运算将考虑小数部分。因此:
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
如果操作数是整数,C将执行整数算术。也就是说,1/4==0
。但是,如果强制操作数为双精度
,则算术运算将考虑小数部分。因此:
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
无论实际值是多少,以下内容都适用:
int / int = int
输出不会自动转换为非int
类型
因此,在进行除法时,输出将被分解为int
您要做的是强制执行以下任一操作:
double / int = double
float / int = float
int / double = double
int / float = float
上面涉及到一个自动-注意,只有一个需要是浮点值
您可以通过以下任一方式完成此操作:
- 将
(双精度)
或(浮点)
放在一个值之前,将其转换为相应的类型或
- 将一个或多个变量更改为
double
或float
请注意,类似于(double)(int/int)
的强制转换将不起作用,因为它首先进行整数除法(它返回int
,从而将值降到最低),然后才将结果强制转换为double
(这与您所做的不进行任何强制转换而将其分配给double
的操作相同).无论实际值如何,以下各项适用:
int / int = int
输出不会自动转换为非int
类型
因此,在进行除法时,输出将被分解为int
您要做的是强制执行以下任一操作:
double / int = double
float / int = float
int / double = double
int / float = float
上面涉及到一个自动-注意,只有一个需要是浮点值
您可以通过以下任一方式完成此操作:
- 将
(双精度)
或(浮点)
放在一个值之前,将其转换为相应的类型或
- 将一个或多个变量更改为
double
或float
请注意,类似于(double)(int/int)
的强制转换将不起作用,因为它首先进行整数除法(它返回int
,从而将值降到最低),然后才将结果强制转换为double
(这与您所做的不进行任何强制转换而将其分配给double
的操作相同).我明白了。非常感谢。我以前选错地方了。我明白了。非常感谢。我以前在错误的地方施法。你能提供一个真实的例子如何运行这段代码吗?输入是什么?您能提供一个如何运行此代码的真实示例吗?输入是什么?