浮點數(floating-point)在不同程式語言中的差異,本質不是數學不同,而是「實作細節不同」。核心標準幾乎都來自
👉 IEEE 754但「語言怎麼用、預設精度、誤差處理」會讓結果看起來不一樣。
拆成 4 層:標準 → 差異來源 → 各語言比較 → 實例
一、浮點數本質(先抓核心)
浮點數其實是:
± (尾數) × 2^(指數)
👉 類似科學記號,但用 2 為底
例如:
10.5 ≈ 1.0101 × 2^3
二、為什麼會有差異?
即使都用 IEEE 754,不同語言還是會出現差異,原因有 5 個:
1️⃣ 精度(precision)不同

👉 有些語言預設 float,有些預設 double
2️⃣ 捨入規則(rounding)
IEEE 754 預設:
👉 四捨六入五成雙(round to even)
但:
- 有些語言可改
- 有些函式庫行為不同
3️⃣ 中間計算精度(關鍵)
有些語言 / 編譯器:
👉 中間計算用更高精度(80-bit)
例如:
- C / C++(x86 平台)
- Java(嚴格 vs 非嚴格模式)
4️⃣ 表達方式(Decimal vs Binary)
👉 0.1 在二進制是「無限循環」
0.1 ≠ 精確表示
所以:
0.1 + 0.2 != 0.3
5️⃣ 標準遵循程度
不同語言:
- 有些完全遵守 IEEE 754
- 有些「大致遵守但有優化」
三、各語言差異對比
🐍 Python
- 預設:double(64-bit)
- 完全遵守 IEEE 754
0.1 + 0.2# 0.30000000000000004
👉 特點:
- 提供
decimal高精度庫 - 結果「誠實顯示誤差」
☕ Java
- 預設:double
- 支援 strictfp(嚴格 IEEE)
double x = 0.1 + 0.2;
👉 特點:
- 不同 JVM 可能略有差異(非 strict 模式)
⚙️ C / C++
- float / double / long double
👉 問題最大:
- 編譯器優化影響結果
- x87(80-bit) vs SSE(64-bit)
double x = 0.1 + 0.2;
👉 同一段程式:
- 不同編譯器 → 結果可能不同
🌐 JavaScript(重點)
👉 只有一種數字型別:double
0.1 + 0.2// 0.30000000000000004
👉 特點:
- 沒有 float
- 所有數字都是 64-bit 浮點
🧮 C# / .NET
- float(32-bit)
- double(64-bit)
- decimal(128-bit,高精度)
decimal x = 0.1m + 0.2m; // 精確
👉 特點:
- financial 計算常用 decimal
🐹 Go
- float32 / float64
- 嚴格 IEEE 754
👉 行為穩定,但沒有內建高精度 decimal
四、問題:為何 0.1 + 0.2 ≠ 0.3?
0.1 + 0.2 = 0.30000000000000004
原因:
👉 0.1 在二進制是:
0.00011001100110011...(無限循環)
👉 被截斷後:
- 產生誤差
- 相加後誤差累積
五、不同語言的「實際差異點」

六、工程師解法(非常重要)
✅ 1️⃣ 不用 == 比較浮點數
abs(a - b) < 1e-9
✅ 2️⃣ 金融計算用 decimal
- Python:
decimal - C#:
decimal
✅ 3️⃣ 控制精度
round(x, 2)
✅ 4️⃣ 避免誤差累積
👉 用整數:
# 元轉分
100 + 200 = 300
七、AI / GPU 中的浮點(進階)
在 NVIDIA GPU:

👉 AI 的關鍵:
接受誤差 → 換取速度
八、一句話總結
👉 浮點數差異 = 精度 + 實作 + 編譯器 + 表示方式

















