python - 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
想知道交易已经结束(我卖掉了我买的所有东西,反之亦然)。
试图将浮点数舍入到其字符串的小数位数,但它一直在发生。
任何想法如何解决这个问题,四舍五入没有帮助
解决方案
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 = []
推荐阅读
- excel - 根据另一个值填充列
- common-table-expression - PonyORM:使用 WITH RECURSIVE CTE 子句而不编写原始 SQL(递归查询)
- java - 如何在 Spring Security 中的 SSO 登录后重定向我的上一页?
- jira - Maven 更改插件不适用于 Jira 云
- swift - RollingPitTabBar 背景问题 - Swift
- laravel - 如何使用 AWS CodePipeline 为 Laravel 应用程序正确创建 buildspec.yml 文件
- node.js - 了解 CosmosDB Gremlin API 中的“x-ms-request-charge”和“x-ms-total-request-charge”
- reactjs - 如何将父组件的react hook创建的引用传递给子组件?
- ruby-on-rails - Rails - 如何测试 validate_with
- bash - 在 Bash 中连接命令的结果