2012-10-22 32 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了解更多关于这些类型及其用法的信息。

相关问题