冰楓論壇

標題: [C#] 避免數值轉換字串顯示科學記號 [打印本頁]

作者: whitefox    時間: 2023-11-29 17:13
標題: [C#] 避免數值轉換字串顯示科學記號
資料型態是 float, double, decimal 遇到數值是小數點後很多0,或只有整數位卻在數值後面含有很多0,這兩種情況下使用 ToString() 方法轉換後就會使用科學記號顯示

這用兩個例子實作
例子1:
  1. double fNum = 0.000006;
  2. string sValue = fNum .ToString();
複製代碼
輸出:6E-06
例子2:
  1. double fNum = 1230000000000000000;
  2. string sValue = fNum .ToString();
複製代碼
輸出:1.23E+18

為避免出現科學記號,可以使用 ToString() 多載方法格式化顯式宣告轉換格式輸出字串
  1. double fNum = 0.00009;
  2. string sValue = fNum.ToString();
  3. Console.WriteLine(sValue); // 輸出:9E-05
  4. sValue = fNum.ToString("N5");
  5. Console.WriteLine(sValue); // 輸出:0.00009
  6. sValue = string.Format("{0:F5}", fNum);
  7. Console.WriteLine(sValue); // 輸出:0.00009
複製代碼
使用上述方法的前提是要明確指定數值的位數
如果設定的位數太小,就會造成精度缺失
  1. double fNum = 0.00009;

  2. string sValue = fNum.ToString();
  3. Console.WriteLine(sValue); // 輸出:9E-05

  4. sValue = fNum.ToString("N3");
  5. Console.WriteLine(sValue); // 輸出:0.000

  6. sValue = string.Format("{0:F3}", fNum);
  7. Console.WriteLine(sValue); // 輸出:0.000
複製代碼
若位數設定的太大,又會在小數位輸出太多0
  1. double fNum = 0.00009;

  2. string sValue = fNum.ToString();
  3. Console.WriteLine(sValue); // 輸出:9E-05

  4. sValue = fNum.ToString("N10");
  5. Console.WriteLine(sValue); // 輸出:0.0000900000

  6. sValue = string.Format("{0:F10}", fNum);
  7. Console.WriteLine(sValue); // 輸出:0.0000900000
複製代碼
要避開上面兩個問題,轉換關鍵字可以採用"#",就不會產生多餘的0

  1. string sValue = fNum.ToString("0.#####"); // 輸出:0.00009
  2. sValue = fNum.ToString("0.##########"); // 輸出:0.00009

  3. fNum = 100.00009;
  4. sValue = fNum.ToString("0.#####"); // 輸出:100.00009
  5. sValue = fNum.ToString("0.##########"); // 輸出:100.00009

  6. fNum = 210000000000000000;
  7. sValue = fNum.ToString("0.#####"); // 輸出:210000000000000000
  8. sValue = fNum.ToString("0.##########"); // 輸出:210000000000000000
複製代碼
以上解決了會有多餘0的問題
但精度不夠的問題還是存在,要解決這個問題可以宣告一個超大數量"#"關鍵字
"#"關鍵字可以宣告的上限值是339個,直接宣告到最大就可以確保所有小數位都可以被轉換
  1. double fNum = 0.00009;
  2. string sValue = fNum.ToString("0." + new string('#', 339)); // 輸出:0.00009
複製代碼
方便使用也可以直接把"#"關鍵字直接定義成一個常數
  1. public const string PrecisionFormat = "0.###################################################################################################################################################################################################################################################################################################################################################";
  2. double fNum = 0.00009;
  3. string sValue = fNum.ToString(PrecisionFormat)); // 輸出:0.00009
複製代碼





歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓