2013-01-22 114 views
0

可能重複:
.Net float to double conversion浮點轉換C#

我,雖然我明白浮點但有人可以解釋以下

float f = 1.85847987E+9F; 
double d = Convert.ToDouble(f); 

d現在轉換成字符串爲1858479872.0。我假設額外2是因爲double不能完全表示浮點數。

我的問題是爲什麼它似乎能夠rerepsent相同號碼時直接分配

double d = 1.85847987E+9; 

,它正好顯示爲185847987.0

+2

或者因爲單精度浮點數不能表示值。看看[這裏](http://msdn.microsoft.com/en-us/library/b1e65aza(v = VS.100).aspx)。 – HABO

+1

這裏有很多關於這個的文章 - 有一個翻身。 – James

+2

Float可以存儲7位有效數字,你有9位。轉換爲double不能奇蹟般地恢復丟失的內容。 –

回答

1

因爲double就可以了,float不能代表1.85847987E+9精確。

爲什麼編譯器不會抱怨「float f = 1.85847987E + 9F;」如果它不能代表得當

按照C#說明書中,部分4.1.6浮點類型

浮點運算符,包括賦值運算符,從來不產生異常。

+0

然後真正的問題是:爲什麼編譯器不會抱怨「float f = 1.85847987E + 9F;'」如果它不能正確表示它! –

+1

@NicolasRepiquet - 是否恰當?如果沒有數據類型可以完全代表1/7,那麼您只需選擇一個不同的數字?該值在_float_的範圍內,因此可以接受。 – HABO

+0

@Nicolas,這符合c#規範。它規定了特殊情況下的各種規則。對於高精度範圍的非特殊情況,編譯器只會降低精度,而不會產生任何異常。 – Tilak

0

問題不是雙重的,而是浮動的。浮點數限制爲32位,而雙精度使用64位。

0

因爲浮標存在於符號,尾數和指數之外。請參閱Jon Skeet's answer here如何提取這些值。對於1.85847987E+9F,尾數爲7259687,指數爲8。然後mantissa << exponent等於1858479872。由於float的精度爲limited to 7 digits,超過7位的任何數字的值取決於實現,而不是輸入。您可以通過輸入123456789F來輕鬆測試。

+0

如果我有一個float開始,那麼什麼是轉換爲字符串'code'Convert.ToDouble(1.85847987E + 9F).ToString()或1.85847987E + 9F.ToString() – user2000579