【发布时间】:2011-11-21 08:57:05
【问题描述】:
与其他浮点类型相比,C# 十进制类型的相等比较是否更有可能像我们直观预期的那样工作?
【问题讨论】:
标签: c# .net floating-point decimal equality
与其他浮点类型相比,C# 十进制类型的相等比较是否更有可能像我们直观预期的那样工作?
【问题讨论】:
标签: c# .net floating-point decimal equality
我想这取决于你的直觉。我假设有些人会认为 1 除以 3 的结果是分数 1/3,而其他人会更多地认为“哦,1 除以 3 不能表示为十进制数,我们'必须决定要保留多少位数,让我们选择 0.333"。
如果您以前一种方式思考,Decimal 不会对您有太大帮助,但如果您以后一种方式思考,并且在需要时明确表示舍入,那么“直观”的操作更有可能不是可能会出现十进制的舍入错误,例如除以 10,将按照您的预期运行。对于大多数人来说,这比二进制浮点类型的行为更直观,其中 2 的幂表现良好,但 10 的幂则不然。
【讨论】:
(0.1m + 0.2m == 0.3m) == true 比(0.1f + 0.2f == 0.3f) == false 直观得多
Decimal 的一个好处是,当显示数字时,可以实际看到它们的真实值。关于计算何时产生特定值的规则不一定比double 更直观。例如,加法不是关联的。向Decimal 加一然后减一可能会改变它的值,即使定点数永远不会这样做。
基本上没有。 Decimal 类型仅表示一种专门的浮点数,旨在减少舍入误差特别是在基数为 10 的系统中。也就是说,Decimal 的内部表示实际上是以 10 为底(十进制)而不是通常的二进制。因此,它是一种更适合货币计算的类型——尽管当然不限于此类应用。
来自MSDN page 的结构:
Decimal 值类型表示从正数 79,228,162,514,264,337,593,543,950,335 到负数 79,228,162,514,264,337,593,543,950,335 的十进制数。 Decimal 值类型适用于需要大量有效整数和小数位数且无舍入错误的财务计算。 Decimal 类型不会消除舍入的需要。相反,它最大限度地减少了由于四舍五入引起的错误。例如,以下代码产生的结果是 0.9999999999999999999999999999 而不是 1。
十进制数是一个浮点值,它包含一个符号、一个数值,其中每个数字的范围从 0 到 9,以及一个比例因子,该比例因子表示分隔整数的浮点小数点的位置和数值的小数部分。
【讨论】: