我試圖解析一個帶有2個小數位的字符串作爲浮點數。解析浮點數導致奇怪的十進制值
問題是,生成的對象有一個不正確的尾數。由於它與我所期望的相差甚遠,我很難相信這是一個四捨五入的問題。
然而翻倍似乎工作。
這個值似乎在浮動範圍內(-3.4×10^38到+3.4×10^38),所以我不明白它爲什麼不按照我的預期解析它。
我嘗試了一些更多的測試,但它並沒有讓我發現更清楚的事情。
我試圖解析一個帶有2個小數位的字符串作爲浮點數。解析浮點數導致奇怪的十進制值
問題是,生成的對象有一個不正確的尾數。由於它與我所期望的相差甚遠,我很難相信這是一個四捨五入的問題。
然而翻倍似乎工作。
這個值似乎在浮動範圍內(-3.4×10^38到+3.4×10^38),所以我不明白它爲什麼不按照我的預期解析它。
我嘗試了一些更多的測試,但它並沒有讓我發現更清楚的事情。
從文檔System.Single
:
所有浮點數具有顯著位的數量有限,這也決定了一個浮點值,如何準確地近似一個實數。單值最多有7個精度的十進制數字,但內部最多保留9位數字。
這不是範圍內浮動的問題 - 這是精度。
最接近的確切值爲650512.56(例如)是650512.5625 ...然後在觀察窗口中顯示爲650512.5625。
說實話,如果你正在解析十進制數字,你應該用decimal
來表示它。這樣,假設它在範圍內,並且沒有超過所需的十進制數字的數量,那麼您將擁有原始字符串的數字表示精確。雖然您可以使用double
並且可以處理9位有效數字,但仍然不會存儲您解析的確切值 - 例如,「0.1」不能完全表示爲double
。
如果你想有更高的精度,你可以使用雙數據類型 – fixagon 2014-10-08 11:35:02
乾杯,這是有道理的,有點。現在雙打會做,但精神上要注意做浮點類型系統的進一步研究。順便愛你的C#書。 – 2014-10-08 11:50:51
c#中float值的尾數有23位,這意味着它可以有6-7位有效數字。在你的例子650512.59
中,你有8個,這就是那個'錯誤'的數字。 Double有52位(15-16位)的尾數,當然它會正確顯示所有8位或9位有效數字。
在這裏看到更多:Type float in C#
你爲什麼不顯示代碼,而不是圖像,我們可以用我們自己測試它? – 2014-10-08 11:33:12
@TimSchmelter這是一個監視窗口。這是代碼。這很簡單。 – 2014-10-08 11:45:30
如果我們有樣本數據,我們可以更容易地重現您的問題。而且我們無法從圖像中獲取(未來將會發生任何變化)。這就是爲什麼我建議發佈變量(包括結果)而不是圖片。例如:'Console.WriteLine(float.Parse(「650512.5」))); ...'(< - 可以複製粘貼) – 2014-10-08 11:49:58