冰楓論壇
標題:
[C#] 避免數值轉換字串顯示科學記號
[打印本頁]
作者:
whitefox
時間:
2023-11-29 17:13
標題:
[C#] 避免數值轉換字串顯示科學記號
資料型態是 float, double, decimal 遇到數值是小數點後很多0,或只有整數位卻在數值後面含有很多0,這兩種情況下使用 ToString() 方法轉換後就會使用科學記號顯示
這用兩個例子實作
例子1:
double fNum = 0.000006;
string sValue = fNum .ToString();
複製代碼
輸出:6E-06
例子2:
double fNum = 1230000000000000000;
string sValue = fNum .ToString();
複製代碼
輸出:1.23E+18
為避免出現科學記號,可以使用 ToString() 多載方法格式化顯式宣告轉換格式輸出字串
double fNum = 0.00009;
string sValue = fNum.ToString();
Console.WriteLine(sValue); // 輸出:9E-05
sValue = fNum.ToString("N5");
Console.WriteLine(sValue); // 輸出:0.00009
sValue = string.Format("{0:F5}", fNum);
Console.WriteLine(sValue); // 輸出:0.00009
複製代碼
使用上述方法的前提是要明確指定數值的位數
如果設定的位數太小,就會造成精度缺失
double fNum = 0.00009;
string sValue = fNum.ToString();
Console.WriteLine(sValue); // 輸出:9E-05
sValue = fNum.ToString("N3");
Console.WriteLine(sValue); // 輸出:0.000
sValue = string.Format("{0:F3}", fNum);
Console.WriteLine(sValue); // 輸出:0.000
複製代碼
若位數設定的太大,又會在小數位輸出太多0
double fNum = 0.00009;
string sValue = fNum.ToString();
Console.WriteLine(sValue); // 輸出:9E-05
sValue = fNum.ToString("N10");
Console.WriteLine(sValue); // 輸出:0.0000900000
sValue = string.Format("{0:F10}", fNum);
Console.WriteLine(sValue); // 輸出:0.0000900000
複製代碼
要避開上面兩個問題,轉換關鍵字可以採用"#",就不會產生多餘的0
string sValue = fNum.ToString("0.#####"); // 輸出:0.00009
sValue = fNum.ToString("0.##########"); // 輸出:0.00009
fNum = 100.00009;
sValue = fNum.ToString("0.#####"); // 輸出:100.00009
sValue = fNum.ToString("0.##########"); // 輸出:100.00009
fNum = 210000000000000000;
sValue = fNum.ToString("0.#####"); // 輸出:210000000000000000
sValue = fNum.ToString("0.##########"); // 輸出:210000000000000000
複製代碼
以上解決了會有多餘0的問題
但精度不夠的問題還是存在,要解決這個問題可以宣告一個超大數量"#"關鍵字
"#"關鍵字可以宣告的上限值是339個,直接宣告到最大就可以確保所有小數位都可以被轉換
double fNum = 0.00009;
string sValue = fNum.ToString("0." + new string('#', 339)); // 輸出:0.00009
複製代碼
方便使用也可以直接把"#"關鍵字直接定義成一個常數
public const string PrecisionFormat = "0.###################################################################################################################################################################################################################################################################################################################################################";
double fNum = 0.00009;
string sValue = fNum.ToString(PrecisionFormat)); // 輸出:0.00009
複製代碼
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓