c++ - 为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1?

浏览:23日期:2023-05-04

问题描述

《C++ Primer》第五版,中文版。p33。1.999999999999999(比转换之后少是 2 的少个 9) 也是 1。微软免费 IDE 2015。g++ 好像也一样。

#include <iostream>using namespace std;int main(){ double d = 1.9999999999999999; int i = d; cout << i << endl; return 0;}

问题解答

回答1:

呐,如果你C语言学习的足够牢靠的话,你应该知道double型的精度是小数点后15位,而如果你写了16位的话,编译器会认为你输入的值无效,而自动帮你转换为2.0。 而根据浮点型转整形的指令规范,1.x转换后均为1,类似的,2.0自然为2。

补充

实质上,你自己写个程序,然后右键汇编就可以看出来了,非常简单的问题。 我再补充下汇编代码就更加清楚了。

15个9的时候,编译后的代码中此处的值为0x3ffffffffffffffbc++ - 为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1?

16个9的时候,编译后的代码直接就是0x4000000000000000,即2.0c++ - 为什么 1.999(共16个9) 转换成 int 是 2,1.9 转换成 int 是 1?

即,这一过程是由编辑器进行的优化而已。

回答2:

因为这个

#include <iostream>using namespace std;int main(){ double d = 1.9999999999999999; int i = d; cout <<'d = '<< d<<'ni = '<< i << endl; return 0;}

你运行一下,看看输出什么。因为浮点数并不是能精确表示所有的数,有些数只能是保存的近似值。这里的1.9999999999999999,就会保存其近似值2。

相关文章: