为什么`double i = 3.3,j = 1.1; int k = i / j; printf(“%d \ n”,k);`得到2?

时间:2014-01-24 09:51:40

标签: c floating-point int double

我发现double / double的结果不正确:

double i = 3.3, j = 1.1;
int k = i/j;
printf("%d\n", k);

结果是2,为什么?
调试:

enter image description here

可是:

float i = 3.3, j = 1.1;
int k = (int)(i/j);
printf("%d\n", k);

调试:

enter image description here

4 个答案:

答案 0 :(得分:2)

3.2999 / 1.10给出2.99和转换为整数时产生输出2

的东西

答案 1 :(得分:2)

双倍不能代表3.3,即使你在你的代码中写入3.3,double也会将其存储为3.2999999999999998。 (它不能存储1.1精确,它将是1.1000000000000001)

所以i/j正在执行3.2999999999999998 / 1.1000000000000001,其结果将存储为2.9999999999999996

将double转换为int会截断该值,它不会将其舍入为最接近的整数,因此2.9999999999999996将转换为2

This同样适用于具有IEEE 754浮点的C,并且还有许多其他资源。

答案 2 :(得分:0)

double i = 3.3, j = 1.1;
int k = i/j;

由于十进制数在内存中的表示方式,i / j的结果实际上是2.999999 ...编译器会将resutl i/j从double转换为int,因为k是一个int。这就是你最终得到2

的结果

答案 3 :(得分:0)

如您所知3.3无法以二进制格式正确表示且1.1相同,评估k = i/j会导致

3.2999999999999998 / 1.1000000000000001  < 3

将此分配到int类型k会将其截断为2