2012-11-21 28 views
2

將小數轉換爲雙精度型時,有時會出現一些意外的截斷。 例如:將小數轉換爲雙精度型時出現意外截斷

 decimal dec = -96.31614743511301m; 
     double dbl = Convert.ToDouble(dec); // dbl = -96.316147435113, why? 

對於它按預期工作的其他值:

 decimal dec2 = -96.269592225955307m; 
     double dbl2 = Convert.ToDouble(dec2); // dbl2 = -96.269592225955307, expected 

注意其實際工作第二個例子中有更多的小數位數比沒有第一。此外,第一值可以成功地轉換成一個雙使用這種費解的代碼:

 dbl = Convert.ToDouble(dec.ToString()); // dbl = -96.31614743511301, expected 

那麼,爲什麼雙值在第一個例子截斷?

回答

3

小數和雙用不同的精度存儲方式不同......看到這裏 - Difference between decimal, float and double in .NET?

+0

存儲細節不談,似乎如果兩個雙和十進制是能夠存儲值-96.31614743511301的,然後轉換,從一個到其他人應該沒有截斷價值。 爲什麼這個工作沒有截斷... double dbl = Convert.ToDouble(「 - 96.31614743511301」); 但這會導致截斷... decimal dec = -96.31614743511301m; double dbl = Convert.ToDouble(dec); –

+1

這看起來像一個bug ... http://stackoverflow.com/questions/1584314/conversion-of-a-decimal-to-double-number-in-c-sharp-results-in-a-difference? RQ = 1 –