使用 math.floor 时 Python 中的舍入问题

Rounding issue in Python when using math.floor

我正在尝试在 Binance 上为多个交易对自动执行加密货币订单。每个交易对都有一个指定的步长,一般为1.0、0.1、0.01等,任何订单都必须符合这个约束否则失败。我尝试通过将美元金额除以当前价格来计算要订购的硬币数量,然后针对此约束进行调整。通常它工作正常,但并非总是如此。这是一些数据的屏幕截图,其中包含带有价格、步骤和订单的代币列表。请注意第 8 项,它的小数点后一位为 1。

计算这个的代码是:

def calculate_order_sizes():
    for coin_dict in coin_list:
        coin_dict['order'] = coin_dict['step'] * math.floor((100/coin_dict['price'])/coin_dict['step'])

100是我要下单的金额

使用浮点数通常有点困难,因为浮点数不能在所有情况下都按您预期的方式表示。这是因为数字不是 base10 而是 base2(在 base 10 中,当试图表示 1/3 时会出现同样的问题)

作为快速修复,您可以添加如下内容:

coin_dict['order'] = float(f'{coin_dict["order"]:.5f}')

它会给你一个最多 5 位小数的浮点数。

您也可以仅使用整数,然后使用 decimal 模块为您提供任意小数位数的小数。 decimal module

一般来说,我更喜欢只使用整数,然后在需要时转换它们。