搜尋

首頁  >  問答  >  主體

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

《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;
}
怪我咯怪我咯2774 天前458

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 13:48:37

    吶,如果你C語言學習的足夠牢靠的話,你應該知道double型的精度是小數點後15位,而如果你寫了16位的話,編譯器會認為你輸入的值無效,而自動幫你轉換為2.0。
    而根據浮點型轉整形的指令規範,1.x轉換後均為1,類似的,2.0自然為2。

    補充

    實質上,你自己寫個程序,然後右鍵彙編就可以看出來了,非常簡單的問題。
    我再補充下組譯程式碼就更加清楚了。

    1. 15個9的時候,編譯後的程式碼中此處的值是0x3ffffffffffffffb

    2. 16個9的時候,編譯後的程式碼直接就是0x4000000000000000,即2.0

    即,這個過程是由編輯器進行的最佳化而已。

    回覆
    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。

    回覆
    0
  • 取消回覆