当除法导致无限重复的数字时,该数字显然会被截断以适应小数的大小。所以像 1/3 这样的东西变成像 0.3333333333333333333 这样的东西。如果我们将该数字乘以 3,我们会得到类似 0.999999999999999999 的结果,而不是保留分数的真实值时得到的 1。
这是 MSDN 关于十进制的文章中的代码示例:
decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
当将值 0.9999999999999999999 与 1 进行比较以获得相等性时,这会导致问题。如果没有精度损失,它们将是相等的,但是在这种情况下,比较当然会导致错误。
人们通常如何处理这个问题?除了为每次比较定义一些误差范围之外,还有更优雅的解决方案吗?