我正在尝试使用Convert.ToDecimal函数将double转换为小数。 问题是某种方式.net选择省略十进制数字,具体取决于原始双变量的大小。
采用以下示例:
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。
有人想过吗?
答案 0 :(得分:3)
这是因为返回的Decimal
值最多只能包含15个有效数字。来自MSDN。
此方法返回的Decimal值最多包含15个值 有效数字。如果value参数包含15以上 有效数字,使用舍入到最近的四舍五入。该 下面的例子说明了Convert.ToDecimal(Double)方法 使用舍入到最近返回值为Decimal的值为15显着 位数。
因此,如果有超过15位有效数字,它将被四舍五入,这就是您的情况下发生的情况,因为您传递的double
值有16位有效数字。
答案 1 :(得分:0)
正如前面提到的Here .net中的双数据类型有15-16位数,我猜你的情况是15,所以省略了最后一位数。为什么你首先使用双? 您可以阅读double vs decimal了解有关这些类型及其用途的更多信息。