【发布时间】:2014-01-25 00:39:04
【问题描述】:
我发现了这种奇怪的行为。然后我在Visual Studio的Immediate窗口上做了几个实验……
? Convert.ToSingle(Decimal.MinValue)
-7.92281625E+28
这里没有惊喜。
? Convert.ToDecimal(Convert.ToSingle(Decimal.MinValue))
'Convert.ToDecimal(Convert.ToSingle(Decimal.MinValue))' threw an exception of type 'System.OverflowException'
base: {"Value was either too large or too small for a Decimal."}
第一个奇怪的行为:即使 Decimal.MinValue 位于 Decimal 域的边界,我认为将其转换为浮点数不会将其推过域限制。
? Convert.ToDecimal(-7.92281625E+28)
-79228162500000000000000000000
嗯……很奇怪……哦,没那么奇怪:它将表达式视为双重。
? Convert.ToDecimal(-7.92281625E+28F)
'Convert.ToDecimal(-7.92281625E+28F)' threw an exception of type 'System.OverflowException'
base: {"Value was either too large or too small for a Decimal."}
让我们试试这个......
? Convert.ToDecimal(-7.92281625E+28D)
-79228162500000000000000000000
...好吧。正如我所想的那样,如果它认为它是浮点数,它就无法转换该数字,但在将它视为双精度时,将它转换回十进制没有问题。
? Convert.ToDecimal(Convert.ToDouble(Decimal.MinValue))
'Convert.ToDecimal(Convert.ToDouble(Decimal.MinValue))' threw an exception of type 'System.OverflowException'
base: {"Value was either too large or too small for a Decimal."}
等等!什么!? 现在我真的迷路了。最后两个表达式有什么区别?为什么它无法从浮点数转换回来?
【问题讨论】:
-
Decimal 是 128 位的数据类型,也许 .MinValue 会因为这个而被淘汰,如果尝试强制转换会发生什么?
-
完全一样: ? (Decimal)Convert.ToSingle(Decimal.MinValue) '(Decimal)Convert.ToSingle(Decimal.MinValue)' 抛出类型为 'System.OverflowException' 的异常 base: {"Value 对于 Decimal 来说太大或太小。 “}? Convert.ToDecimal((float)Decimal.MinValue) 'Convert.ToDecimal((float)Decimal.MinValue)' 抛出类型为 'System.OverflowException' 的异常 base: {"对于 Decimal 而言,值太大或太小。 "}
标签: c# c#-4.0 c#-3.0 type-conversion