如果我尝试将Decimal.MaxValue
从Decimal
转换为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
值吗?
我理解Single
和Decimal
之间存在差异,并期望精度从Decimal
转换为Single
,但是{{{ 1}}大于Single.MaxValue
对于十进制"它的值太大或太小都没有意义。如果您认为这有意义,请在答案中解释原因。
此外,
Decimal.MaxValue
所以将此号码转换为Convert.ToSingle(Decimal.MaxValue)
// 7.92281625E+28
没有问题。
答案 0 :(得分:4)
您做出了错误的假设:
Decimal.MaxValue
作为Single
的值肯定是有效的Decimal
值?
Decimal.MaxValue
的值为79,228,162,514,264,337,593,543,950,335
。 float
无法表示接近该精度级别的任何位置,因此当您将decimal
值转换为float
时,最终会得到近似值。
在这种情况下,float
在内部表示为2^96
。事实证明这是一个非常好的近似值 - 79,228,162,514,264,337,593,543,950,336
- 但请注意最后一位数字。
float
的值大于Decimal.MaxValue
,这就是您将其转换回decimal
的尝试失败的原因。
(.NET框架在尝试诊断这些问题时并没有提供太多帮助。它始终显示float
的预先舍入值 - {{1}或类似的 - 并且绝不是它在内部使用的完全近似。)