首页 > 解决方案 > python浮点加法结果具有意外的小数位

问题描述

我有以下代码通过计算订单来检测股票交易:

import json

orders = '[{"side": "SELL", "executedQty": "0.046"}, {"side": "SELL", "executedQty": "0.041"}, {"side": "SELL", "executedQty": "0.056"}, {"side": "SELL", "executedQty": "0.140"}, {"side": "BUY", "executedQty": "0.283"}]'
orders = json.loads(orders)

cur_qty = 0
raw_trades = []
trade = []
trade_side = None
for order in orders:
    if trade_side is None:
        trade_side = order['side']

    numbers_after_decimal = len(order['executedQty'].split('.')[-1])
    order_qty = float(order['executedQty'])
    order_qty = round(order_qty, numbers_after_decimal)

    if trade_side == order['side']:
        cur_qty += order_qty
    else:
        cur_qty -= order_qty

    trade.append(order)
    if cur_qty == 0:
        raw_trades.append(trade)
        trade_side = None
        trade = []

在这个例子中,订单只有 1 笔交易(我们卖出 0.046 + 0.041 + 0.056 + 0.140 = 0.283(入场),我们买入 0.283(离场))

问题是,当运行这段代码时,由于某种原因,当在 for 循环中时,顺序是{"side": "SELL", "executedQty": "0.140"}and cur_qty = 0.143,当我添加它们时,结果是0.28300000000000003.

这弄乱了整个计数,因为我cur_qty == 0想知道交易已经结束(我卖掉了我买的所有东西,反之亦然)。

试图将浮点数舍入到其字符串的小数位数,但它一直在发生。

任何想法如何解决这个问题,四舍五入没有帮助

标签: pythonfloating-pointdecimal

解决方案


cur_qty因此,在阅读了@user79161 的答案后,我找到了以下解决方案——在加法之后,我还根据和的字符串表示中的较高小数点对数字进行了四舍五入order_qty

这是代码现在的样子:

import json

orders = '[{"side": "SELL", "executedQty": "0.046"}, {"side": "SELL", "executedQty": "0.041"}, {"side": "SELL", "executedQty": "0.056"}, {"side": "SELL", "executedQty": "0.140"}, {"side": "BUY", "executedQty": "0.283"}]'
orders = json.loads(orders)

cur_qty = 0
raw_trades = []
trade = []
trade_side = None
for order in orders:
    if trade_side is None:
        trade_side = order['side']

    numbers_after_decimal = len(order['executedQty'].split('.')[-1])
    order_qty = float(order['executedQty'])
    order_qty = round(order_qty, numbers_after_decimal)

    numbers_after_decimal_cur_qty = len(str(cur_qty).split('.')[-1])

    decimal_numbers = max([numbers_after_decimal_cur_qty, numbers_after_decimal])

    if trade_side == order['side']:
        cur_qty += order_qty
    else:
        cur_qty -= order_qty

    cur_qty = round(cur_qty, decimal_numbers)

    trade.append(order)
    if cur_qty == 0:
        raw_trades.append(trade)
        trade_side = None
        trade = []

推荐阅读