9.4 浮點數字面常數與混合運算
¶浮點數字面常數
直接寫在程式碼裡的小數(字面常數,上冊 2.8 的老朋友)有幾種寫法:
| 寫法 | 意思 | 型態 |
|---|---|---|
1.5 |
1.5 | double(預設) |
1. |
1.0 | double(小數部分是 0 可省) |
.5 |
0.5 | double(整數部分是 0 可省) |
1.2e3 |
1.2 \times 10^3 = 1200 | double(e 記法) |
2.5E-2 |
2.5 \times 10^{-2} = 0.025 | double(E 大小寫皆可) |
1.5f |
1.5 | float(後綴 f) |
1.5l |
1.5 | long double(後綴 l) |
e 記法怎麼寫:1.2e3 就是 1.2 \times 10^3(9.2 學過的科學記號,程式碼裡也能直接這樣寫小數)。正指數的 + 可以省略(1.2e3 與 1.2e+3 完全一樣),但負指數的 - 不能省——1.2e-3 才是 1.2 \times 10^{-3}。e 寫成大寫 E 皆可。
規則跟整數字面常數(上冊附錄 G)一個邏輯:不加後綴就是 double。競程幾乎只用得到這個預設。完整規格可查 cppreference: Floating-point literal。
¶混合運算:整數除法的陷阱又來了
浮點數和整數混在同一個運算裡時,規則是(上冊 3.7 隱性轉換的最後一塊拼圖):
- 兩個運算元都是整數 → 整數運算(除法照樣捨去小數!)
- 至少一個是浮點數 → 整數那邊先被轉成浮點數,用浮點數運算
陷阱全部藏在第一條。看這個經典翻車現場:
#include <iostream>
using namespace std;
int main() {
cout << 1 / 2 << '\n'; // 兩個 int:整數除法 → 0
cout << 1.0 / 2 << '\n'; // 有一個 double:浮點除法 → 0.5
cout << 1 / 2.0 << '\n'; // 同上 → 0.5
cout << 1 / 2 * 1.0 << '\n'; // 先算 1/2 = 0,再 × 1.0 → 還是 0!
return 0;
}
執行結果:
0
0.5
0.5
0
第四行是重點中的重點:* 1.0 放在後面根本來不及救——1 / 2 在它出手前就已經用整數除法變成 0 了。要讓除法變浮點除法,必須讓「除號的其中一邊」在相除的當下就是浮點數。
動手試試看:回到單元開頭的萬元折價百分比,現在你已經集齊需要的工具——用 double 與正確的混合運算把它解掉。這題要求精確輸出,算好答案後直接 cout << ans << endl; 就好,不要加 setprecision:答案最多只有兩位小數,9.2 說過 cout 的預設輸出會把它完整印出來、多餘的零也不會印,硬補位數反而會被判錯。