可以转换为浮点数然后再转换回十进制的最小小数是多少?
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
现在您可以看到 decMin
比 decimal.MinValue
更负面 - 这解释了为什么它无法转换。
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
现在您可以看到 decMin
比 decimal.MinValue
更负面 - 这解释了为什么它无法转换。