为什么不进行十进制转换?MaxValue在Single和Decimal之间可传递
本文关键字:Single Decimal 之间 可传递 MaxValue 十进制 转换 为什么不 | 更新日期: 2023-09-27 18:15:22
如果我尝试将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
会损失精度,但由于Single.MaxValue
大于Decimal.MaxValue
,因此"值对于十进制来说太大或太小"是没有意义的。如果你认为这是有道理的,请在回答中解释为什么。
Convert.ToSingle(Decimal.MaxValue)
// 7.92281625E+28
所以把这个数字转换成Single
没有问题
你做了一个错误的假设:
显然
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
失败的原因。
float
—7.92281625E+28
或类似的预舍入值,而不会显示它内部使用的完整近似值