首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# object 轉 double 精度遺失問題解析

     編輯:程式設計疑難解答

問題現象

當 object 類型變數儲存值為 0.149999991 時,直接轉型為 double 可能導致精度變化,顯示為 0.15 或科學記號形式。

根本原因

double 採用 IEEE 754 雙精度浮點數格式,二進位無法精確表示許多十進位小數(如 0.1、0.149999991),轉換過程中會發生捨入誤差。

解決方案

方案一:使用 decimal 類型(推薦財務/精確計算)

object val = 0.149999991;
decimal precise = Convert.ToDecimal(val); // 保持精確值
// 或
decimal precise = (decimal)val; // 若 object 實際為 double 需先轉 double

decimal 為 128 位十進位浮點數,可精確表示 28-29 位有效數字,適合財務、科學計算。

方案二:字串中介轉換(保持原始字面值)

object val = 0.149999991;
string str = val.ToString(); // "0.149999991"
double d = double.Parse(str); // 仍可能有極微小誤差,但字面值一致

方案三:直接賦值(若 object 實際即為 double)

object val = 0.149999991d; // 編譯時即為 double
double d = (double)val; // 無轉換損失,直接引用同一記憶體

最佳實踐建議

  • 涉及金額、精確測量:全程使用 decimal
  • 需序列化/傳輸原始字面值:使用字串格式化 val.ToString("G17")
  • 一般科學計算:接受 double 固有誤差,顯示時用 ToString("F9") 控制小數位

程式碼示範

object input = 0.149999991;
// 方案一:decimal 精確保持
decimal d1 = Convert.ToDecimal(input);
Console.WriteLine(d1); // 0.149999991

// 方案二:字串保持字面值
string s = input.ToString();
double d2 = double.Parse(s);
Console.WriteLine(d2.ToString("F9")); // 0.149999991

// 方案三:直接轉型(僅當 object 實際為 double)
double d3 = (double)input;
Console.WriteLine(d3); // 可能顯示 0.149999991 或 0.15
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved