2014-10-08 56 views
0

我試圖解析一個帶有2個小數位的字符串作爲浮點數。解析浮點數導致奇怪的十進制值

問題是,生成的對象有一個不正確的尾數。由於它與我所期望的相差甚遠,我很難相信這是一個四捨五入的問題。

enter image description here

然而翻倍似乎工作。

這個值似乎在浮動範圍內(-3.4×10^38到+3.4×10^38),所以我不明白它爲什麼不按照我的預期解析它。

我嘗試了一些更多的測試,但它並沒有讓我發現更清楚的事情。

enter image description here

+0

你爲什麼不顯示代碼,而不是圖像,我們可以用我們自己測試它? – 2014-10-08 11:33:12

+0

@TimSchmelter這是一個監視窗口。這是代碼。這很簡單。 – 2014-10-08 11:45:30

+1

如果我們有樣本數據,我們可以更容易地重現您的問題。而且我們無法從圖像中獲取(未來將會發生任何變化)。這就是爲什麼我建議發佈變量(包括結果)而不是圖片。例如:'Console.WriteLine(float.Parse(「650512.5」))); ...'(< - 可以複製粘貼) – 2014-10-08 11:49:58

回答

3

從文檔System.Single

所有浮點數具有顯著位的數量有限,這也決定了一個浮點值,如何準確地近似一個實數。單值最多有7個精度的十進制數字,但內部最多保留9位數字。

這不是範圍內浮動的問題 - 這是精度

最接近的確切值爲650512.56(例如)是650512.5625 ...然後在觀察窗口中顯示爲650512.5625。

說實話,如果你正在解析十進制數字,你應該用decimal來表示它。這樣,假設它在範圍內,並且沒有超過所需的十進制數字的數量,那麼您將擁有原始字符串的數字表示精確。雖然您可以使用double並且可以處理9位有效數字,但仍然不會存儲您解析的確切值 - 例如,「0.1」不能完全表示爲double

+0

如果你想有更高的精度,你可以使用雙數據類型 – fixagon 2014-10-08 11:35:02

+0

乾杯,這是有道理的,有點。現在雙打會做,但精神上要注意做浮點類型系統的進一步研究。順便愛你的C#書。 – 2014-10-08 11:50:51

1

c#中float值的尾數有23位,這意味着它可以有6-7位有效數字。在你的例子650512.59中,你有8個,這就是那個'錯誤'的數字。 Double有52位(15-16位)的尾數,當然它會正確顯示所有8位或9位有效數字。

在這裏看到更多:Type float in C#