可以转换为浮点数然后再转换回十进制的最小小数是多少?

What is the minimum decimal which can be converted to float and then back to decimal?

var t = (decimal)((float)decimal.MinValue)

error CS0031: Constant value '-7.922816E+28' cannot be converted to a 'decimal' 失败,但为什么?

decimal.MinValue-79228162514264337593543950335m。它成功转换为 float,因为 -79228160000000000000000000000f 大于 decimal.MinValue:

(float)decimal.MinValue > decimal.MinValue

为什么这个值无法转换?我知道这与有效数和指数有关,但到底发生了什么?哪个是可以在 C# 中转换为浮点数然后再转换回十进制的最小小数?

您没有打印浮点数的完整精度,因此看不到导致它失败的值。

如果按如下方式更改代码:

var decMin = (float)decimal.MinValue;
Console.WriteLine(decMin.ToString("R")); // "-7.9228163E+28"

// Next line throws System.OverflowException: Value was either too large or too small for a Decimal.
var dec = (decimal)decMin; 

decMin的值显示为-7.9228163E+28。为了更容易比较,让我们重写没有指数并将其与 decimal.MinValue:

进行比较
decMin           = -79_228_163_000_000_000_000_000_000_000
decimal.MinValue = -79_228_162_514_264_337_593_543_950_335

现在您可以看到 decMindecimal.MinValue 更负面 - 这解释了为什么它无法转换。