2

我正在尝试使用 Convert.ToDecimal 函数将双精度数转换为十进制数。问题是 .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。

有什么想法吗?

4

2 回答 2

3

这是因为Decimal返回的值最多只能有 15 个有效数字。来自MSDN

此方法返回的Decimal值最多包含 15 个有效数字。如果 value 参数包含超过 15 个有效数字,则使用舍入到最接近的方式对其进行舍入。下面的示例说明 Convert.ToDecimal(Double) 方法如何使用舍入到最接近来返回具有 15 个有效数字的Decimal值。

因此,如果有效数字超过 15 个,它将被四舍五入,这就是您的情况,因为double您传递的值有 16 个有效数字。

于 2012-10-22T11:47:42.493 回答
0

正如这里提到,.net 中的双重数据类型有 15-16 位,我猜在你的情况下它是 15,所以它省略了最后一位。你为什么首先使用双精度?您可以阅读double vs decimal以了解有关这些类型及其用法的更多信息。

于 2012-10-22T11:49:54.603 回答