Python 浮点精度在比较过程中会导致错误

Python 浮点精度在比较过程中会导致错误,python,floating-point,Python,Floating Point,我正在使用python 2.7.6。当我把它输入解释器时 >>> 0.135-0.027 0.10800000000000001 然而它应该是公正的 0.108 这会在比较事物时产生问题,例如我想要比较 >>> 0.135-0.027 <= 0.108 False 这个问题有类似的解决方案吗?这可能会有帮助: 你也可以用它来控制精度。你可以做很多事情,但每一件都有自己的优点和缺点 基本问题是,从十进制到任何有限二进制表示的转换都涉及舍入。例如,如

我正在使用python 2.7.6。当我把它输入解释器时

>>> 0.135-0.027
0.10800000000000001
然而它应该是公正的

0.108
这会在比较事物时产生问题,例如我想要比较

>>> 0.135-0.027 <= 0.108
False
这个问题有类似的解决方案吗?

这可能会有帮助:


你也可以用它来控制精度。

你可以做很多事情,但每一件都有自己的优点和缺点

基本问题是,从十进制到任何有限二进制表示的转换都涉及舍入。例如,如果您使用IEEE四倍精度,这些情况将更为罕见,但仍然会发生

您可以使用十进制库或任意精度库,但如果您必须进行数以万亿计的计算,您可能不愿意在运行时支付使用它们的成本


在这种情况下,你必须问自己一个问题:“我到底准确地知道这些数字吗?”然后你可以考虑,“允许
0.135-0.027吗一般来说,在所有计算机语言中比较实数是否相等是一个坏主意,因为浮点数的存储方式。你应该考虑一个公差,比如将你的条件重写为
abs(0.135-0.027-0.108)@Selcuk他不是在比较相等,而是在做更大的事情(-或相等的事情)-在某些情况下,这些也可以从公差中受益,但这远不如严格相等。可能重复@delnan是的,但它失败的部分是相等部分。可以使用<或>,但容易失败的是使用=,=。仅供参考:这如何优于标准库的<代码>decimal
module?主要是精度级别。您可以选择使用任何您喜欢的模块。
decimal
模块是解决此问题的正确方法(因为此问题是二进制浮点的副作用).bigfloat、mpmath和gmpy2都提供任意精度的二进制浮点。它们将提供更高的精度,但仍然无法准确表示所有十进制数。我知道我可以通过使用库来解决此问题,我想知道是否可以避免这样做
from __future__ import division
double add_ulp(double x) {
    union {
        double x;
        unsigned sign : 1;
        unsigned expo : 11;
        unsigned long mant : 52;
    } inc;
    inc.x = x;

    inc.mant = 0;
    if (inc.expo >= 52 ) {
        inc.expo -= 52;
        return x+inc.x;
    }
    return x;
}
if( x-y <= add_ulp(z) ) {
    // ...
}