为什么不能将Double隐式强制转换为Decimal
我不理解十进制和双精度的转换规则。
这样做是合法的
decimal dec = 10; double doub = (double) dec;
然而令我困惑的是,十进制是一个16字节的数据类型,double是8个字节,因此不会将一个双倍的十进制数转换为加宽的对话,因此应该隐式允许; 以上例子不允许?
如果从double
转换为decimal
,则可能会丢失信息 – 该数字可能完全超出范围,因为double
的范围远大于decimal
的范围。
如果从decimal
转换为double
精度,则可能会丢失信息 – 例如,0.1可以用decimal
表示,但不能用double
精度表示, decimal
实际上使用的精度比double
精度多得多。
隐式转换不应该丢失信息(从long
到double
的转换可能,但这是一个不同的论点)。 如果您要丢失信息,则必须通过显式强制转换告诉编译器您已经知道这一点。
这就是为什么没有隐式转换的原因。
十进制更精确,因此您将丢失信息。 这就是为什么你只能明确地做到这一点。 这是为了保护您免于丢失信息。 请参阅MSDN
http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx
您可以在两个方向显式转换:从double
到decimal
,从decimal
到double
。
您无法隐式转换任何一个方向,原因很简单:转换可能不是无损失。
例如,十进制数1234567890123456789不能完全表示为double。 同样,双数10^32
不能精确地表示为十进制数。
为避免无意中丢失信息,不允许隐式转换。