我发现double / double的结果不正确:
double i = 3.3, j = 1.1;
int k = i/j;
printf("%d\n", k);
结果是2,为什么?
的调试:
可是:
float i = 3.3, j = 1.1;
int k = (int)(i/j);
printf("%d\n", k);
调试:
答案 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
。