2016-11-08 122 views
1

簡而言之,我想知道爲什麼下面的ToString()行不符合我的期望。需要幫助瞭解C#浮點字符串格式化

float actual = 111253.469F; 
double rounded = Math.Round(actual, 2); // 111253.47 (expected) 
string stringified = actual.ToString(); // 111253.50 (expected 111253.469) 
string currency = actual.ToString("C"); // $111253.50 (expected 111253.47 or possibly .46) 

有人可以解釋發生了什麼嗎?

注意: 我不認爲浮點值是準確的,每浮點數的其他問題。不過,我確實希望字符串輸出反映所討論的浮點數的字符串值。

在這種情況下,如果我設置了一個斷點並在快速查看中查看'actual'的值,它不會顯示'111253.5',它會顯示'111253.469'。我不明白爲什麼打印時不會這樣。特別是在貨幣情況下,我期望它將四捨五入到適當的小數點,然後顯示,而不是選擇其他字面值。這不是一個數學問題,它是一個ToString()行爲問題。

編輯: 每Quantic的評論下面,它出現在ToString使用G格式默認情況下,限制數量7顯著位,導致這裏被看到的數量。

+2

不可能。 111253將永遠不會給出11253作爲輸出 –

+0

@ThomasWeller對不起,我的評論線不準確(不包括第一個1),但它是扔給我的小數部分,對不起。我會糾正的。 – SWC

+0

如果你想要小數點上的兩個數字,你可以使用下面的例子:ToString(「0.00」); ToString(「n2」); //代碼爲 ToString(「c2」); //對於貨幣 – tdog

回答

1

根據MSDN about Single.ToString()(重點煤礦):

默認情況下,返回值只包含的精度 7個位數雖然最大爲9位內部保持。如果此實例的值大於7位數,則M:System.Single.ToString(System.String)將返回P:System.Globalization.NumberFormatInfo.PositiveInfinitySymbol或P:System.Globalization.NumberFormatInfo.NegativeInfinitySymbol,而不是預期的編號。 如果您需要更高的精度,請指定具有「G9」格式規格的格式,該格式總是返回9位精度或「R」,如果數字可以用該精度表示,則返回7位數字,如果數字可以爲9位數字僅以最高精度代表

所以,你的代碼示例的行爲完全爲記載:

  • ToString()將使用"G"默認情況下,將使用7位精度
  • ToString("C")還將使用精密7個位數

"R""G9"將返回111253.469,"G8"返回s 111253.47

0

您沒有ToString()問題,您有浮點數問題。

一個float是一個浮點值,通過定義有7位精度:MSDN

現在,你有超過7位數:float actual = 111253.469F,所以系統查房至少顯著的人,你會得到111253.5作爲您的操作的結果,您可以使用。 請注意,double的計算是正確的,因爲它可以處理超過7位有效數字。