提问人:Maxim Gershkovich 提问时间:10/19/2011 最后编辑:Olivier Jacot-DescombesMaxim Gershkovich 更新时间:3/16/2021 访问量:11803
为什么不能将 Double 隐式转换为 Decimal
Why can't Double be implicitly cast to Decimal
问:
我不明白十进制和双精度的铸造规则。
这样做是合法的
decimal dec = 10;
double doub = (double) dec;
然而,让我感到困惑的是,decimal 是 16 字节的数据类型,而 double 是 8 个字节,所以不将 double 转换为 decimal 是一个扩大的对话,因此应该隐式允许;上面的例子是不允许的?
double doub = 3.2;
decimal dec = doub; // CS0029: Cannot implicitly convert type 'double' to 'decimal'
答:
十进制更精确,因此您会丢失信息。这就是为什么你只能明确地这样做。这是为了保护您免于丢失信息。请参阅 MSDN
http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx
http://msdn.microsoft.com/en-us/library/364x0z75.aspx
如果从 转换为 ,则可能会丢失信息 - 数字可能完全超出范围,因为 a 的范围远大于 a 的范围。double
decimal
double
decimal
如果从 转换为 ,则可能会丢失信息 - 例如,0.1 完全可以表示 in,但不能表示 ,并且实际上使用比特更多的位来提高精度。decimal
double
decimal
double
decimal
double
隐式转换不应丢失信息(从 到 的转换可能,但这是一个不同的论点)。如果你要丢失信息,你应该通过显式强制转换告诉编译器你已经意识到了这一点。long
double
这就是为什么无论哪种方式都没有隐式转换的原因。
评论
您可以在两个方向上显式强制转换:from to 和 from to 。double
decimal
decimal
double
你不能在任一方向上隐式转换,原因很简单:转换可能不是无损的。
例如,十进制数1234567890123456789不能精确地表示为双精度。同样,双精度数不能精确表示为十进制数。10^32
为避免无意中丢失信息,不允许进行隐式转换。
评论