當 object 類型變數儲存值為 0.149999991 時,直接轉型為 double 可能導致精度變化,顯示為 0.15 或科學記號形式。
double 採用 IEEE 754 雙精度浮點數格式,二進位無法精確表示許多十進位小數(如 0.1、0.149999991),轉換過程中會發生捨入誤差。
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 val = 0.149999991d; // 編譯時即為 double
double d = (double)val; // 無轉換損失,直接引用同一記憶體
decimalval.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