由數字 0-9 與小數點組成,可帶正負號。
合法:0.0, .25, 5.789, 0.13, 5.0, 300., -267.8230
非法:345(無小數點,屬整數常數)
關鍵:必須包含小數點,否則視為整數常數。
格式:a E n 或 a e n(a 為十進位數,n 為十進位整數,可帶正負號)
值:a × 10ⁿ
合法:2.1E5 (2.1×10⁵), 3.7E-2 (3.7×10⁻²), 0.5E7, -2.8E-2
非法:345 (無小數點), E7 (無底數), -5 (無 E), 53.-E3 (負號位置錯), 2.7E (無指數)
f / F:明確指定為 float 型態(單精度)double 型態(雙精度)
356f 等價於 356.0f (float)
356. 等價於 356.0 (double)
void main() {
printf("%f\n%f\n", 356., 356f); // 兩者輸出相同數值,但型態不同
}
| 特性 | float (單精度) | double (雙精度) |
|---|---|---|
| 關鍵字 | float | double |
| 記憶體大小 | 4 bytes (32 bits) | 8 bytes (64 bits) |
| 數值範圍 | 3.4E-38 ~ 3.4E+38 | 1.7E-308 ~ 1.7E+308 |
| 有效數字 | 7 位 | 15-16 位 |
| 宣告範例 | float x, y; | double a, b, c; |
void main() {
float a;
double b;
a = 33333.33333;
b = 33333.33333333333333;
printf("%f\n%f\n", a, b);
}
結果分析:
- a (float):整數部分 5 位,僅剩 2 位小數有效,後續皆為雜訊
- b (double):16 位有效數字完整保留,但 printf("%f") 預設僅顯示小數 6 位,四捨五入
教材提供兩組 Practice 區塊,模擬除錯器變數觀察視窗(Vtable/Vupdate),展示變數值隨程式執行逐步變化:
// 程式碼
int a = 32;
float b;
double d;
b = 12345678;
d = b * 100;
d = d + a;
d = d + 58.123456;
// 觀察視窗變化
// 初始:a=32, b=0.0, d=0.0
// b=12345678.0 → 實際儲存約 1.2345678E7(float 精度限制)
// d=1234567800.0
// d=1234567832.0
// d=1234567890.123456
// 程式碼
int a = 543;
float b;
b = 123.123962 + a; // a→float,相加
b = b - 100; // float 減法
a = b; // float→int 截斷
// 觀察視窗變化
// 初始:a=543, b=0.0
// b=123.123962
// b=23.123962
// a=23(截斷小數)
fabs(a-b) < EPSILONfloat f = 0.1; 會有 double→float 轉換,建議 float f = 0.1f;printf("%.10f", d) 顯示 10 位小數,%e 科學標記法1e10 + 1.0 - 1e10 可能得 0 而非 1(精度吞沒)f/F 指定 float,否則預設 double