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

Why can't Double be implicitly cast to Decimal

提问人:Maxim Gershkovich 提问时间:10/19/2011 最后编辑:Olivier Jacot-DescombesMaxim Gershkovich 更新时间:3/16/2021 访问量:11803

问:

我不明白十进制和双精度的铸造规则。

这样做是合法的

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'
C# 类型 强制转换

评论

0赞 Dyppl 10/19/2011
我会说这是为什么不能隐式十进制做双倍
0赞 Maxim Gershkovich 10/19/2011
好的,所以通过更多的测试,我似乎有点困惑,但我的基本问题仍然存在......
4赞 Eric Lippert 7/26/2013
仅供参考,这个问题是我2013年7月博客的主题。ericlippert.com/2013/07/18/......谢谢你的好问题!

答:

3赞 Pieter 10/19/2011 #1

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

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

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

38赞 Jon Skeet 10/19/2011 #2

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

如果从 转换为 ,则可能会丢失信息 - 例如,0.1 完全可以表示 in,但不能表示 ,并且实际上使用比特更多的位来提高精度。decimaldoubledecimaldoubledecimaldouble

隐式转换不应丢失信息(从 到 的转换可能,但这是一个不同的论点)。如果你要丢失信息,你应该通过显式强制转换告诉编译器你已经意识到了这一点。longdouble

这就是为什么无论哪种方式都没有隐式转换的原因。

评论

6赞 Eric Lippert 10/19/2011
你当然是对的,但我要借此机会指出,不幸的是,有一些内置的隐式转换会丢失信息——例如,长到倍。没有一个内置的隐式转换会损失幅度,但其中一些会失去精度。我们本可以隐式地将幅度保持但精度损失从十进制转换为双精度,但选择不这样做。
9赞 Eric Lippert 10/19/2011
这里的理由不仅仅是您可能会丢失信息;从根本上说,转换是一件愚蠢的事情。双精度旨在表示不精确的物理量,例如科学测量。小数点旨在表示确切的数量,例如股票价格或抵押贷款余额。如果你要将一个转换为另一个 - 比如说,你正在将股票价格转换为双倍,以便将它们与一个为双倍而编写的统计分析库一起使用 - 那么你应该清楚你打算进行精确损失的转换。
1赞 Jeffrey Sax 10/19/2011 #3

您可以在两个方向上显式强制转换:from to 和 from to 。doubledecimaldecimaldouble

你不能在任一方向上隐式转换,原因很简单:转换可能不是无损的。

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

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