冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 4875|回覆: 0
打印 上一主題 下一主題

[心得] [C#] 避免數值轉換字串顯示科學記號

[複製鏈接]

1114

主題

0

好友

1042

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
390967
帖子
2182
主題
1114
精華
0
積分
1042
楓幣
26484
威望
578
存款
10100
贊助金額
1800
推廣
0
GP
3799
閱讀權限
150
在線時間
272 小時
註冊時間
2023-5-18
最後登入
2025-12-25

2023年紀念勳章 太陽勳章 神手勳章 高級客戶 VIP會員 私服達人 懶人勳章 幼兒勳章 音樂勳章 屁孩勳章 貢獻王 性別(女) 性別(男) 積分勳章 發帖達人 2023端午節紀念勳章 富豪勳章 富可敵國 2023中秋節紀念勳章 解說達人 論壇粉絲 2023聖誕節紀念勳章 2024年紀念勳章 2024端午節紀念勳章 2024中秋節紀念勳章 2024聖誕節紀念勳章 2025年紀念勳章 2025端午節紀念勳章 2025中秋節紀念勳章 2025聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-11-29 17:13:06 |只看該作者 |倒序瀏覽
資料型態是 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
複製代碼
收藏收藏0 推0 噓0

分享這篇文章



把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策詐騙防範及資料調閱

Copyright © 2011-2025 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2025-12-26 00:53

回頂部