【发布时间】:2015-02-11 00:47:41
【问题描述】:
我了解decimal 是一种适用于金融和货币的数字格式,因为它具有固定的精度。
因此,当两个decimals 相加或相减时,永远不会损失精度。
考虑到这一点,我可以理解编译器必须禁止操作“decimal”+“double”,因为可能会损失精度。
但是当你将两个 decimals 相乘(或相除)时会发生什么?
让我们考虑一个简单的十进制类型,总共只有 4 位数字,小数点后有 2 位精度(从 00.00 到 99.99)。
你可以定义a = 0.01
然后将m = a * a = 0.0001 截断为0.00,因此会损失精度。
尽管损失了精度,但编译器认为此操作是合法的。
所以我们在 C# 中有以下情况:
-
decimal / int:尽管精度下降,但合法 -
decimal / decimal:尽管精度下降,但合法 -
decimal * decimal:尽管精度下降,但仍合法 -
decimal * double: 非法
(当然,你总是可以用强制转换来覆盖,但是这个解决方案对我来说并不令人满意。)
还有其他我不知道的原因来解释吗?
在处理利率、增值税率或一般利率时,对我来说,使用双精度值来存储这些值似乎更符合逻辑,然后能够将它们与小数一起使用。 但我必须在两者之间做出选择:
- 使用
decimal存储速率(过大)。 - 使用
double存储速率,然后进行转换(丑陋)。
考虑到所有这些,我的问题是:
C# 编译器禁止 'decimal' * 'double' 是否有原因?
【问题讨论】:
标签: c# floating-point