2014-01-30 23 views
2

所以,我有這個浮點數:爲什麼C#以這種方式舍入?

(float)-123456.668915

這是隨機選擇的,因爲我做的BCD碼一大塊,我寫​​一些單元測試的數字。每當我去比較上面的數字與一個字符串("-123456.668915"要清楚),我遇到了C#如何四捨五入的問題。它把它變成-123456.7。這已經在NUnit中檢查過,並且直接輸出控制檯。

爲什麼它是這樣四捨五入?根據MSDN,float的範圍約爲-3.4 * 10^38到+3.4 * 10^38,精度爲7位數。除非我完全錯過了某些東西,否則上面的數字是以及在該範圍內,並且只有小數點後面有6位數字。

感謝您的幫助!

回答

14

根據MSDN的說法,float的範圍約爲-3.4 * 10^38到+3.4 * 10^38,精度爲7位數。除非我完全缺少某些東西,否則上述數字就在該範圍內,並且只有小數點後6位數字。 「

」小數點後6位「與」6位精度「不同。精度的位數是可以可靠地保持的有效位數。你的電話號碼有有效數字,所以它不能完全由float表示。

請注意,它的數量(假設)四捨五入到-123456.7,確實有7位有效數字。事實上,這也不是你的float的價值。我強烈懷疑確切的值是-123456.671875,因爲這是最接近的float到-123456.668915。但是,當您將精確值轉換爲字符串表示形式時,結果只有7位數字,部分原因是超出該位置數字無論如何不是真正有意義的。

您應該閱讀my article about binary floating point in .NET瞭解更多詳情。

+0

哇,我感到啞巴。我總是有這樣的印象:在任何一方儲存7個,或者在該點之後至少儲存7個。讓我檢查一下。 – Nakaan

+1

@Nakaan:我添加了一篇鏈接,指向您可能會覺得有用的文章。考慮到「float」值有多大,對於*總是*會在小數點右邊有7位數字,這意味着最大數字將有* 46 *有效數字。 –

+0

好的,我修整了0.6以上的所有內容,並且通過了測試並匹配了預期的輸出。呵呵。謝謝,我今天學到了一些新東西! – Nakaan

0

浮點類型的精度爲24位有效位(非反規範除外),相當於24 log 2& 7.225位重要的十進制數字。號碼-123456.668915有12位有效數字,因此無法準確表示。

實際的二進制值,四捨五入成24個有效位,是-11110001001000000.1010110。這相當於分數-7901227/64 = -123456.671875。舍入到7位有效數字表示您看到的-123456.7

相關問題