当除法结果为无限重复的数字时,数字显然会被截断以适应小数点的大小。所以像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相等相比,这导致一个问题。没有精度的损失,它们将是平等的,但当然在这种情况下,比较会导致错误。
人们通常如何处理这个问题?除了为每个比较定义一些误差外,是否还有更优雅的解决方案?
@nathanhayfield看起来你错过了这个问题的最后一句话。 –
尽管如此,那*就是这样做的一般方式,无论是在位置上,还是在函数内部都有空白的情况下,或者让你指定一个(这在可读性方面会更优雅,但概念相同)。(不要忘记,如果你曾经向用户展示过结果,也可能会看到一些可读的结果,没有人愿意看到他们欠$ 1.99999999999。是的,我已经看到过这种情况,好几次。) – neminem
这是一个古老而知名的问题在数字计算 –