whitefox 發表於 2023-11-29 17:13:06

[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若位數設定的太大,又會在小數位輸出太多0double 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
頁: [1]
查看完整版本: [C#] 避免數值轉換字串顯示科學記號