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