2013-02-22 73 views
0

我正在尝试对整数进行一些运算。问题是,当我试图进行除法运算以获得双精度结果时,结果始终为0.00000000000000000000,尽管这对于((7 * 207)/ 6790)等显然不是这样。我曾尝试对公式进行类型转换,但我仍然得到相同的结果。C中的整数将数值向下舍入/结果为零

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

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

你能提供一个真实世界的例子如何运行这段代码?什么是输入? – Andrej 2013-09-05 05:31:40

回答

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而不进行任何投射相同)。

0

如果你将((7 * 207)/ 6790)尝试

double val = double(7*207)/double(6790); 

,因为当你只是把它,C假定整数,所以它变为零!

+0

这仍然导致整数除法,只有结果被转换为'double'。 – Archie 2013-02-22 10:27:22

+0

@Archie好的,谢谢你的提示,我纠正了我的帖子。 – 2013-02-22 10:29:56

+0

@ bash.d这种形式的转换只适用于C++。 – 2013-02-22 19:59:29

1

这是千真万确的,其结果是0,或0.0如果你认为在double这样的表达式((7 * 207)/6790)

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

您需要将其转换为浮点类型以更改该属性,例如, ((7 * 207)/6790.0)

很多啊似乎期望赋值的右侧是自动由目标变量的类型“调整”:这是不是它是如何工作的。 结果已转换,但不影响右侧表达式中的任何“内部”操作。在代码:

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

所有o12o21numTokens是整数,使得表达为整数求值,然后被转换成浮点因为e11double

这样做

const double a_quarter = 1/4; 

这仅仅是一个相同的问题的简单的情况:该表达式的计算第一,则结果(整数0)转换为加倍并存储。这就是语言的工作原理。

解决方法是投:

e11 = ((o12 * o21)/(double) numTokens); 
+0

我明白了。谢谢!我以前在错误的地方投了。 – user2052561 2013-02-22 10:31:41

0

您必须分裂之前投这些数字来double。当您在int上进行除法运算时,结果也是一个舍入为零的整数,例如1/2 == 0,但是1.0/2.0 == 0.5

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