許多初學者在使用 C/C++ 進行浮點數運算時,常會對 double 和 float 的精度產生疑惑。例如:10000.0 / 3.0 的結果輸出為 3333.333333333335(共 18 個字符),但 double 的有效精度只有 15 位;而轉為 float 後輸出 3333.3333,float 的精度卻是 6-7 位。這到底是怎麼一回事?
首先必須區分儲存精度與輸出精度:
float 約 6-7 位十進制數字,double 約 15-16 位。printf、cout 等函數顯示時,預設或指定輸出的小數位數。當你使用 printf("%f") 或 cout 直接輸出時,函數會預設輸出 6 位小數(printf)或根據內部格式化規則輸出更多位數。編譯器會將二進制浮點數轉換為十進制字串,這個轉換過程可能產生超過實際精度的數字(如尾部的 3335),這屬於輸出格式化行為,而非資料本身精度提升。
printf("%.6f", value); // 輸出小數點後 6 位
printf("%.15f", value); // 輸出小數點後 15 位(double 建議不超過 15)
#include <iomanip>
std::cout << std::fixed << std::setprecision(6) << value;
若 float 變數輸出 3333.3333,通常是因為預設輸出格式限制了位數,或數值本身在轉換為 float 時已發生精度截斷。建議顯式指定輸出精度以觀察真實儲存值。
double 或定點數庫,避免二進制浮點誤差。