当我这样做时:
float add=0;
int count[] = {3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1}
for (int i=0; i<11; i++)
add += 1 / ((float)count+1);
输出结果为:
4.00000000000000000000
但是当我这样做时:
float add=0;
int count[] = {3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1}
for (int i=0; i<11; i++)
add += 1.0 / ((float)count+1);
输出结果为:
3.99999976158142089844
当我需要将一个int转换成一个浮点数时,我要么在前面添加(float)
,要么让它用一个小数运算,例如a / 1.0
。有什么区别吗?
编辑: 添加所需的行为。
原因是之后,我需要一个结果,将add
添加到int输出的另一个int变量中。但是,当我以第二种方式执行时,int使用3而不是4,所以我想知道第一个和第二个代码之间的区别。
答案 0 :(得分:4)
您的代码不是C,但这是:
#include <stdio.h>
int main ()
{
float add = 0;
int count[] = { 3, 2, 1, 3, 1, 2, 3, 3, 1, 2, 1 };
for (int i = 0; i < 11; i++) {
add += 1 / ((float) count[i] + 1);
}
printf("%f\n", add);
return 0;
}
我已使用add += 1 / ((float) count[i] + 1);
和add += 1.0 / ((float) count[i] + 1);
执行此代码。
在这两种情况下,printf("%f\n", add);
都会打印4.000000
。
但是,当我打印变量add
的每一位时,它会给我01000000011111111111111111111111
(3.9999998)和01000000100000000000000000000000
(4)
正如phuclv所指出的,这是因为1.0
是double
,因此计算是以双精度完成的,而使用1
时,计算是使用单精度完成的(因为演员要漂浮了。)
如果您在第一个等式中将强制转换替换为double
,或者在第二个等式中将1.0
更改为1.0f
,则您将获得相同的结果。