2017年9月20日 星期三

[C#] float 轉字串顯示8位數

維護舊案子時,因為有項數值存取內容的位數非常大,而且還會持續變大

目前數字為3316679,七位數。

被問到若數字大到一定程度會怎麼樣,所以檢視一下程式。




變數當初設計時只使用了float來存取,由於我們只需要整數的部分

實際跑debug模式,看起來是這樣



9位數則是這樣,出現了誤差



所以一開始覺得到8位數應該沒什麼問題,不過發現真正有問題是轉為字串的時候

數字就出現了誤差。不管是8位數還是9位數






後來在網路上查詢到此篇
https://stackoverflow.com/questions/26119509/c-sharp-float-tostring-rounding-values

以及微軟的說明

https://msdn.microsoft.com/en-us/library/f71z6k0c%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

原因是
  • The precision of a float is 7 digits.
By default, the return value only contains 7 digits of precision although a maximum of 9 digits is maintained internally. If the value of this instance has greater than 7 digits, ToString(String) returns PositiveInfinitySymbol or NegativeInfinitySymbol instead of the expected number. If you require more precision, specify format with the "G9" format specification, which always returns 9 digits of precision, or "R", which returns 7 digits if the number can be represented with that precision or 9 digits if the number can only be represented with maximum precision.


所以說將tostring方法裡加入 "G9"就可以正確顯示到8位數



9位數還是會出現誤差


其實G8就可以正確顯示8位數了


不過該篇文章也提到,並非所有數都可以正確無誤差,

如 16777217轉字串後變成16777216

所以最好的方式還是需將float型態改為double


1 則留言:

區網電腦連 WAMP 架設的網站 出現You don’t have permission to access / on this server 解決辦法

參考 修改 httpd.conf 內容 1. 將 Require all denied 改為 Require all granted 參考2  修改  httpd-vhosts.conf  內容 2.將 Require local 改為 Require ...