为什么不进行十进制转换?MaxValue在Single和Decimal之间可传递

本文关键字:Single Decimal 之间 可传递 MaxValue 十进制 转换 为什么不 | 更新日期: 2023-09-27 18:15:22

如果我尝试将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会损失精度,但由于Single.MaxValue大于Decimal.MaxValue,因此"值对于十进制来说太大或太小"是没有意义的。如果你认为这是有道理的,请在回答中解释为什么。

另外

Convert.ToSingle(Decimal.MaxValue)
// 7.92281625E+28

所以把这个数字转换成Single没有问题

为什么不进行十进制转换?MaxValue在Single和Decimal之间可传递

你做了一个错误的假设:

显然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框架并没有提供太多帮助。它将始终显示float7.92281625E+28或类似的预舍入值,而不会显示它内部使用的完整近似值