为什么不能将Double隐式强制转换为Decimal

时间:2011-10-19 07:26:13

标签: c# types casting

我不理解十进制和双精度的转换规则。

这样做是合法的

decimal dec = 10;
double doub = (double) dec;

然而令我困惑的是,十进制是一个16字节的数据类型,double是8个字节,因此不会将一个double加到十进制加宽的会话中,因此应该隐式允许;以上例子不允许?

3 个答案:

答案 0 :(得分:34)

如果您从double转换为decimal,则可能会丢失信息 - 该数字可能完全超出范围,因为double的范围远大于decimal的范围decimal

如果您从double转换为decimal,则可能会丢失信息 - 例如,0.1可在double中完全表示,但不能在decimal中表示,{{1实际上比double使用了更多的比特用于精度。

隐式转化不应该丢失信息(从longdouble的转换可能,但这是一个不同的论点)。如果您要丢失信息,您应该通过显式转换告诉编译器您已经知道这一点。

这就是为什么不存在隐式转换的原因。

答案 1 :(得分:3)

十进制更精确,因此您将丢失信息。这就是为什么你只能明确地做到这一点。这是为了保护您免于丢失信息。见MSDN

http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

答案 2 :(得分:1)

您可以向两个方向明确投射:从doubledecimal以及从decimaldouble

您无法隐式转换任何一个方向,原因很简单:转换可能不是无损失。

例如,十进制数1234567890123456789无法准确表示为double。同样,双数10^32不能精确表示为十进制数。

为避免无意中丢失信息,不允许隐式转换。