2012-07-18 97 views
1

簡單問題:爲什麼我沒有得到20151231當輸入爲2.0151231E7F

Console.WriteLine("Double: " + 2.0151231E7); 

雙:20151231

Console.WriteLine("Single: " + 2.0151231E7F); 

單:2.015123E + 07

爲什麼?


背景:我耗費了SOAP網絡服務,其中一個元素聲明:

<xsd:element name="VALUE_FROM" type="xsd:float" /> 

在SOAP響應它看起來像這樣:

<VALUE_FROM>2.0151231E7</VALUE_FROM> 

但我'20151230而不是20151231.

回答

5

20151231具有二進制25位數字。 A float只有24 binary digits in the mantissa。因此最後一點不得不離開。

+0

您引用的URL不支持浮點數只有尾數24位的聲明。它根本不使用術語「尾數」,因爲這是錯誤的術語。尾數是對數的小數部分。浮點表示的小數部分是有效數。 – 2012-07-18 16:39:11

+0

這兩個術語都被使用,@EricPostpischil。只是沒有在特定的文章。 – harold 2012-07-18 16:43:27

+0

「尾數」一詞並未出現在1985或2008 IEEE 754標準中。它在參考浮點時的使用是草率和誤導性的。 – 2012-07-18 16:48:10

3

它與Float(IEEE 754)的精度有關,與Double數據類型相比 - 後者具有更高的精度,因此可以充分表示數字。

定義在計算機中如何表示單精度浮點數的標準的IEEE 754標準僅指定用於指數的有效位數(小數)和8位信息的24位精度(信息)。

+0

+1正確使用「有效數」而不是「尾數」(正確的是對數的小數部分,而不是浮點數表示的小數部分)。 – 2012-07-18 16:37:09

+0

非常感謝,並且還爲+1提供了寶貴的答案。 – mono68 2012-07-18 16:59:25

+0

不客氣@mon68 – 2012-07-18 17:20:49

1

這只是因爲一個浮點數(用.Net表示的System.Single)不夠精確。

你可以通過使用double而不是float來獲得更好的精度,但是你仍然會有一些(但少得多)的近似值。

如果你想操縱整數沒有任何精度損失,使用整數類型(INT,UINT,長,ULONG等)

從文檔:

浮點點值和精密

的損失請記住,浮點數只能近似於十進制數 ,而浮點精度數決定 如何ACCU率那個數字接近一個十進制數字。默認情況下, 單個值僅包含7位精度的十進制數字,儘管 最多可以在內部維護9位數字。一個 浮點數的精度有幾種結果:出現等於特定 精度,因爲他們至少顯著 位數是不同的可能比不上等於

兩個浮點數。

使用浮點如果一個十進制數被用於 因爲浮點數可能無法精確近似 十進制數 數目可能不產生相同的結果的數學或比較操作。

如果涉及浮點數,則值可能不會往返。如果一個操作將某個操作將原始的浮點數轉換爲另一種形式,則操作數 值被稱爲往返,反操作將轉換後的格式轉換回浮點數,最後的浮點數等於原始的浮點數。 往返可能會失敗,因爲轉換中丟失或更改了一個或多個最低有效數字 。

+0

謝謝,但在這種情況下,數據類型是由我必須使用的Web服務決定的。 – mono68 2012-07-18 17:02:04

相關問題