2014-12-01 27 views
1

我希望我已經研究了這一點,我的前提並不完全脫離基礎。如果是這樣,那麼在那裏的數學家可以讓我直觀。爲什麼使用「G」標準格式字符串格式化Double不會返回完整的字符串?

我的前提是,Double值,如12.5應四捨五入至5個顯著數字(非小數)爲12.500。相反,使用下面的C#代碼,我得到12.5

Double d = 12.5; 
Console.WriteLine(d.ToString("G5")); 

我從2007年這似乎呼應了我的問題碰到this post。事實上,我正在使用這些示例數字來保持事物的一致性。

我的目標在這裏是爲了更好地瞭解以下內容:

  • 是我的簽名圖的理解數學上正確?也就是說,我的期望是否合理,或者輸出「12.5」是否正確?

  • 這真的是(非常長壽命)在框架中的錯誤?如果是這樣,是否可以修復?

  • 假設這是一個錯誤,我現在可以做些什麼?寫一個黑客來確定有多少 sig fig你實際上回來然後填充它?滾我自己的代碼到 做什麼「G」格式的字符串是應該做?我已經在SO上遇到過這方面的例子,所以也許這就是沒有乾淨選擇的證據。

此外,我也知道有Double存儲問題可能這個問題的四捨五入方面產生負面影響,但現在,我只關心更多的SIG的無花果比原來的數字問題。

編輯:我已經測試了這個框架4.5。

+0

僅12.5的值* *有3位有效數字。精度指定輸出中的*最大*位數,而不是確切的位數。我注意到,我在迴應你所提到的線索,有很多與此處相同的想法...... – 2014-12-01 19:37:20

+0

@JonSkeet它的確說得最多。剛開始時,這讓我感到很難過。儘管如此,我仍然擔心本Voigt的回答,認爲12.500數學上更準確,因爲它表明讀者更精確。這不正確嗎?這是我正在嘗試傳達的準確性建議。 – DonBoitnott 2014-12-01 19:42:46

+0

當我看到你的觀點時,我認爲裏克引用的文檔是最引人注目的,說實話。如果您對特定數量的有效數字(包括尾隨零)感興趣,那麼您可能需要查看「decimal」。 – 2014-12-01 19:50:51

回答

6

看到這個鏈接G-Format Specifier。它明確指出:

如果需要,結果包含一個小數點,並且小數點後的尾隨零被忽略。

0

A Double將值舍入爲15位有效數字,而不是5位。

參考:The General ("G") format specifier

四捨五入一些任意數量的顯著數字並不意味着格式化字符串必須包含這一數字位數。如果該值四捨五入到12.5000000000000那麼它將被格式化爲"12.5",因爲這是表示該值的最緊湊方式。

+0

我明白「round to」和「significant figures」之間的區別。我建議12.500向讀者傳達比12.5更高的精確度。而我對sig fig的定義的記憶與此相關。現在,C#格式化字符串可能無法正常播放...... – DonBoitnott 2014-12-01 19:46:39

+0

@DonBoitnott:Double數據類型不會跟蹤數值的精確性,因此爲了顯示完整的精度,它總是會格式化爲15位有效數字。如果給變量賦予了'12.500',它仍然會被格式化爲'12.5000000000000',因爲即使輸入不是那麼精確,數據類型也可以處理它的精度。 – Guffa 2014-12-01 21:16:43