如何在python中比较float和decimal?

How to compare float and decimal in python?

提问人:Jeff 提问时间:11/27/2021 更新时间:11/28/2021 访问量:106

问:

我在数据帧中有一个()列,如下所示:decimal.Decimal

    dt = pd.DataFrame({"OPEN": [-0.00010,-0.0114, 0.0066,-0.0044,-0.0012,-0.0005,
                                 0.0005,-0.0037, -0.0029, 0.0034, 0.0003, 0.0001 ]})

dt["OPEN"] = dt["OPEN"].apply(Decimal)

我想在专栏上使用以下方法:applyOpen

def label_change_price(delta):

    if 0 < abs(delta) < 0.0001:
        print(" Return value: ",0, "Delta: ",delta)
        return 0
    elif 0.0001 <= abs(delta) < 0.0002:
        print(" Return value: ",1, "Delta: ",delta)
        return int(np.sign(delta)) * 1
    elif 0.0002 <= abs(delta) < 0.0003:
        print(" Return value: ",2, "Delta: ",delta)
        return int(np.sign(delta)) * 2
    elif 0.0003 <= abs(delta):
        print(" Return value: ",3, "Delta: ",delta)
        return int(np.sign(delta)) * 3

当我运行代码时,对于第一行 () 它打印-0.00010

Return value: 0 Delta: -0.00010

这是错误的,因为它必须返回 ,但是它返回.10

换句话说,第一个条件来了,它不会继续到第二个条件。ifTrueelif

所以,我想知道,为什么我的第二个不能很好地工作,当 delta 为 0.0001 时?我该如何解决它?elif 0.0001 <= abs(delta) < 0.0002:

Python 十进制 浮点精度

评论

1赞 OrenIshShalom 11/28/2021
无法复制,然后是我得到 True ...delta = -0.0001print(0.0001 <= abs(delta) < 0.0002)
0赞 alani 11/28/2021
我也无法重现它。Jeff 你能不能把它编辑成一个完整的独立程序,以便其他人可以更容易地测试是否可以重现它。
0赞 Jeff 11/28/2021
嗯,我从文件中读取了我的真实数据集。这可能是问题的原因吗?csv
0赞 alani 11/28/2021
可能,但请显示一个最小的 CSV 文件,该文件显示问题以及用于读取和处理它的实际代码。人们越容易重现问题,你得到答案的机会就越大。
0赞 jasonharper 11/28/2021
如果你的值曾经是一个浮点数,那么它在物理上不可能有确切的值 -0.0001 - 在通常的二进制浮点表示中甚至不存在这样的值。它实际上类似于 -0.00010000000000000000005。要获得准确的十进制值(否则有什么意义呢?),您必须直接从字符串表示形式进行转换。delta

答:

-1赞 TMBailey 11/28/2021 #1

您可以尝试这样的比较:

if abs(Decimal(0)) < abs(delta) < abs(Decimal(0.0001)):

比较似乎很棘手:

from decimal import Decimal

Decimal(0.0001) == 0.0001
# True

abs(Decimal(0.0001)) == 0.0001
# False

Decimal(0.0001) == Decimal(0.0001)
# True

abs(Decimal(0.0001)) == Decimal(0.0001)
# False

abs(Decimal(0.0001)) == abs(Decimal(0.0001))
# True

评论

1赞 Jeff 11/28/2021
是的,但为什么它如此复杂?