为什么单个和十进制传递之间没有Decimal.MaxValue的转换?

时间:2015-09-30 12:56:45

标签: c#

如果我尝试将Decimal.MaxValueDecimal转换为Single然后再转回,转换将失败并显示OverflowException

Convert.ToDecimal(Convert.ToSingle(Decimal.MaxValue))
// '...' threw an exception of type 'System.OverflowException'
//     base: {"Value was either too large or too small for a Decimal."}

是什么给出的?当然,Decimal.MaxValue作为Single的值应该是有效的Decimal值吗?

我理解SingleDecimal之间存在差异,并期望精度Decimal转换为Single,但是{{{ 1}}大于Single.MaxValue对于十进制"它的值太大或太小都没有意义。如果您认为这有意义,请在答案中解释原因。

此外,

Decimal.MaxValue

所以将此号码转换为Convert.ToSingle(Decimal.MaxValue) // 7.92281625E+28 没有问题。

1 个答案:

答案 0 :(得分:4)

您做出了错误的假设:

  

Decimal.MaxValue作为Single的值肯定是有效的   Decimal值?

Decimal.MaxValue的值为79,228,162,514,264,337,593,543,950,335float无法表示接近该精度级别的任何位置,因此当您将decimal值转换为float时,最终会得到近似值。

在这种情况下,float在内部表示为2^96。事实证明这是一个非常好的近似值 - 79,228,162,514,264,337,593,543,950,336 - 但请注意最后一位数字。

float的值大于Decimal.MaxValue,这就是您将其转换回decimal的尝试失败的原因。

(.NET框架在尝试诊断这些问题时并没有提供太多帮助。它始终显示float的预先舍入值 - {{1}或类似的 - 并且绝不是它在内部使用的完全近似。)