2015-09-30 29 views
3

如果我嘗試從Decimal轉換Decimal.MaxValueSingle,然後再返回,轉換失敗有OverflowException爲什麼Decimal.MaxValue不會在Single和Decimal之間轉換?

Convert.ToDecimal(Convert.ToSingle(Decimal.MaxValue)) 
// '...' threw an exception of type 'System.OverflowException' 
//  base: {"Value was either too large or too small for a Decimal."} 

是怎麼回事?當然值Decimal.MaxValue作爲Single應該是一個有效的Decimal值?

我明白SingleDecimal之間的差異期望的精度Decimal轉換損失SingleSingle.MaxValue大於Decimal.MaxValue它沒有意義的「價值是太大或太小十進制「。如果您認爲這樣做有道理,請解釋答案中的原因。

此外,

Convert.ToSingle(Decimal.MaxValue) 
// 7.92281625E+28 

所以沒有問題這個號碼轉換爲Single

+0

你是否會混淆'double'和'decimal'? 'Decimal.MaxValue'爲79,228,162,514,264,337,593,543,950,335,'Single.MaxValue'爲3.402823e38。 – kat0r

+0

@DStanley不,它不是。 'var s = Convert.ToSingle(Decimal.MaxValue);'運行得很好。 – juharr

+1

請注意,'float'只會有十進制值的近似值,看起來近似值更大。 – juharr

回答

4

你讓一個不正確的假設:

真像SingleDecimal.MaxValue值應該是一個有效的 Decimal價值?

Decimal.MaxValue的值是79,228,162,514,264,337,593,543,950,335。 A float不能代表接近該精度水平的任何地方,因此當您將decimal值轉換爲float時,最終會得出近似值。

在這種情況下,float在內部表示爲2^96。這原來是一個相當不錯的近似值 - 79,228,162,514,264,337,593,543,950,336 - 但記下最後一位數字。

float的值大於Decimal.MaxValue,這就是您嘗試將其轉換回decimal失敗的原因。 (.NET框架在試圖診斷這些類型的問題時沒有提供太多的幫助,它總是會顯示一個預先取得的值,或者類似的 - 而不是完全的近似值它在內部使用。)

+0

是的。 'Convert.ToSingle'執行四捨五入到最近的。 –

相關問題