2012-10-22 59 views
2

我想通過Convert.ToDecimal函數將double轉換爲小數。 問題是,.net根據原始雙變量的大小選擇省略小數位。Double Convert.ToDecimal控制十進制數字

看看下面的例子:

 double d = 2999247013.972682; 
     decimal convDecimal = Convert.ToDecimal(d); 
     decimal realDecimal = 2999247013.972682M; 

     Console.WriteLine(d); 
     Console.WriteLine(convDecimal); 
     Console.WriteLine(realDecimal); 

將會產生以下的輸出:

2999247013,97268 // comments: (actual value 2999247013,972682) 
2999247013,97268 // comments: (actual value 2999247013,97268) 
2999247013,972682 // comments: (actual value 2999247013,972682) 

( '' 是當前語言環境的小數點分隔符)

什麼,我想實現方法是使用Convert.ToDecimal(d)並獲取十進制數2999247013,972682。

任何想法的人?

回答

3

這是因爲Decimal返回的值最多隻能有15個含義數字。從MSDN

該方法返回的Decimal值最多包含15個 有效數字。如果值參數包含多於15個 的有效數字,則會使用四捨五入將其舍入到最近。以下示例說明了Convert.ToDecimal(Double)方法 如何使用四捨五入來最接近以返回Decimal值和15位重要 數字。

因此,如果有超過15個顯著數字將被四捨五入,這是你的情況發生,因爲你傳遞double值有16個顯著數字。

+0

因此,據我所知,問題是Convert.ToDecimal無法處理超過15個有效數字,即使Decimal作爲類型明確支持此值。 – Entrodus

+0

問題不在於'Decimal'可以支持更多數字,而是'Double'值是有限的。小數比雙精度更精確,所以限制因素是你傳入方法的兩倍。 – keyboardP

+0

好的。事情現在開始有意義。感謝您的所有信息。 – Entrodus

0

如上所述Here .net中的雙數據類型有15-16位,我想你的情況是15,所以它省略了最後一位數字。爲什麼你首先使用雙? 你可以閱讀double vs decimal瞭解更多關於這些類型及其用法的信息。

相關問題