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

用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

我想对整数做一些算术运算。问题是当我试图除法得到一个双精度的结果时,结果总是0.00000000000000,尽管这对于((7*207)/6790)之类的东西显然是不正确的。我已经尝试过对公式进行类型转换,但仍然得到相同的结果

我做错了什么?我该如何修复它

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
的操作相同).

我明白了。非常感谢。我以前选错地方了。我明白了。非常感谢。我以前在错误的地方施法。你能提供一个真实的例子如何运行这段代码吗?输入是什么?您能提供一个如何运行此代码的真实示例吗?输入是什么?