語法書 / AA 競程語法書 下冊 / 第九單元 / 科學記號與 cout 的預設輸出

9.2 科學記號與 cout 的預設輸出

科學記號複習

數學課學過科學記號:把一個數寫成 a \times 10^b(其中 1 \le a < 10),方便表示很大或很小的數。例如 12 億寫成 1.2 \times 10^90.0012 寫成 1.2 \times 10^{-3}

程式的輸出沒辦法印上標,所以用 e 記法代替:ae+b 就是 a \times 10^b

e 記法 科學記號 一般寫法
1.002e+06 1.002 \times 10^6 1002000
9e-06 9 \times 10^{-6} 0.000009
1.2e+09 1.2 \times 10^9 1200000000

理解方式:b 是正的,小數點往右b 位;b 是負的,往b 位;位數不夠用 0 補。

cout 印浮點數的預設規則

現在可以解釋 9.1 的謎題了。cout 印浮點數的預設規則是:

  1. 最多顯示 6 位有效數字9.1 的新詞:從第一個不是 0 的數字數起),多出來的部分四捨五入(嚴格說是「取最接近的值」,細節到下一節再談)。
  2. 數字太大(用 6 位有效數字排不下整數部分)或太小(比 0.0001 還小),就改用科學記號
  3. 小數尾端多餘的 0 不印(1.50 印成 1.5;整數值如 25.0 直接印 25)。

回頭看 9.1 的三組輸出:

  • 1.443 位有效數字,直接印。
  • 1002001:有 7 位數字,超過 6 位——改用科學記號,且第 7 位被四捨五入掉了,變成 1.002e+06
  • 0.000009:比 0.0001 小——改用科學記號 9e-06
  • 動手試試看的 6.0:小數部分是 0——規則 3,印成整數的樣子 6

範例程式碼

#include <iostream>
using namespace std;

int main() {
    cout << 1.44 << '\n';        // 6 位有效數字內:照印
    cout << 25.0 << '\n';        // 小數部分是 0:印成整數的樣子
    cout << 1002001.0 << '\n';   // 7 位數字:科學記號 + 四捨五入
    cout << 0.0001 << '\n';      // 剛好在門檻上:還是小數
    cout << 0.00001 << '\n';     // 比 0.0001 小:科學記號
    return 0;
}

執行結果:

1.44
25
1.002e+06
0.0001
1e-05

動手試試看:先猜 cout << 123456789.0;cout << 0.5; 各印什麼,再執行驗證。猜錯的話回頭對照三條規則,找出是哪一條在作用。