9.2 科學記號與 cout 的預設輸出
¶科學記號複習
數學課學過科學記號:把一個數寫成 a \times 10^b(其中 1 \le a < 10),方便表示很大或很小的數。例如 12 億寫成 1.2 \times 10^9、0.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 印浮點數的預設規則是:
- 最多顯示 6 位有效數字(9.1 的新詞:從第一個不是 0 的數字數起),多出來的部分四捨五入(嚴格說是「取最接近的值」,細節到下一節再談)。
- 數字太大(用 6 位有效數字排不下整數部分)或太小(比 0.0001 還小),就改用科學記號。
- 小數尾端多餘的 0 不印(1.50 印成
1.5;整數值如 25.0 直接印25)。
回頭看 9.1 的三組輸出:
- 1.44:3 位有效數字,直接印。
- 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; 各印什麼,再執行驗證。猜錯的話回頭對照三條規則,找出是哪一條在作用。