維護舊案子時,因為有項數值存取內容的位數非常大,而且還會持續變大
目前數字為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
網誌管理員已經移除這則留言。
回覆刪除