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

Max*_*ich 28 c# types casting

我不理解十进制和双精度的铸造规则.

这样做是合法的

decimal dec = 10;
double doub = (double) dec;
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 36

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

如果转换decimaldouble,则可能会丢失信息 - 例如,0.1可以完全表示decimal但不能表示double,并且decimal实际上使用的位数比精度高得多double.

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

这就是为什么没有隐式转换的原因.

  • 这里的推理不仅仅是你可以丢失*信息*; 这是转换*从根本上说是一件愚蠢的事情*.双重意图表示像不精确的物理量,如科学测量.小数旨在表示确切的数量,如股票价格或抵押贷款余额.如果你要将一个转换为另一个 - 比如说,你将股票价格转换为加倍,以便将它们用于编写统计分析库以获取双倍 - 那么你应该清楚你打算进行精确失败的转换. (9认同)
  • 你当然是正确的,但我会借此机会指出**,不幸的是,有一些内置的隐式转换失去了信息 - 例如,长到两倍.内置的隐式转换都没有丢失*幅度*,但有些会失去*精度*.我们本可以使幅度保持但精确丢失的转换从十进制到双精度也是隐含的,但是选择不这样做. (6认同)