冰楓論壇

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

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

[複製鏈接]

855

主題

0

好友

869

積分

高級贊助會員

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

UID
390967
帖子
1660
主題
855
精華
0
積分
869
楓幣
12244
威望
409
存款
10100
贊助金額
1800
推廣
0
GP
2803
閱讀權限
150
在線時間
197 小時
註冊時間
2023-5-18
最後登入
2024-12-22

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

跳轉到指定樓層
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-2024 冰楓論壇, All rights reserved

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

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

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

GMT+8, 2024-12-22 13:31

回頂部