《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;
}
大家讲道理2017-04-17 13:48:37
吶,如果你C語言學習的足夠牢靠的話,你應該知道double
型的精度是小數點後15位,而如果你寫了16位的話,編譯器會認為你輸入的值無效,而自動幫你轉換為2.0。
而根據浮點型轉整形的指令規範,1.x
轉換後均為1,類似的,2.0
自然為2。
實質上,你自己寫個程序,然後右鍵彙編就可以看出來了,非常簡單的問題。
我再補充下組譯程式碼就更加清楚了。
15個9的時候,編譯後的程式碼中此處的值是0x3ffffffffffffffb
16個9的時候,編譯後的程式碼直接就是0x4000000000000000,即2.0
即,這個過程是由編輯器進行的最佳化而已。
高洛峰2017-04-17 13:48:37
因為這個
#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。