繁体   English   中英

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

[英]Why can't Double be implicitly cast to Decimal

当涉及到十进制和双精度时,我不明白转换规则。

这样做是合法的

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

然而让我困惑的是,decimal 是一个 16 字节的数据类型,double 是 8 个字节,所以不会将 double 转换为十进制扩展对话,因此应该隐式允许; 上面的例子不允许?

double doub = 3.2;
decimal dec = doub; // CS0029: Cannot implicitly convert type 'double' to 'decimal'

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

如果您从decimal转换为double ,您可能会丢失信息 - 例如, 0.1 可以精确地表示为decimal而不是double ,并且decimal实际上比double使用更多的精度位。

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

这就是为什么没有任何隐式转换的原因。

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

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

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

您可以在两个方向显式转换:从doubledecimal和从decimaldouble

出于一个很好的理由,您不能在任一方向进行隐式转换:转换可能不是无损的。

例如,十进制数 1234567890123456789 不能完全表示为双精度数。 同样,双数10^32不能准确地表示为十进制数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM