Binance API错误-1111:BTCUSDT精度超限问题求助
问题根源分析
- Float类型的精度丢失:你当前函数最后将Decimal转成float返回,但float的二进制存储无法精确表示所有十进制小数。比如日志里的
0.28761,转成float后可能变成0.28761000000000003这类带冗余小数位的数值,提交给Binance时会触发-1111精度超限错误。 - 舍入模式的潜在问题:默认的
ROUND_HALF_UP舍入可能在边缘场景产生不符合平台隐含要求的数值,不过从你的日志看,这并非本次报错的核心原因。
修复方案
核心逻辑是全程用Decimal处理数值,避免float转换导致的精度丢失,最终以字符串格式提交参数(Binance API支持字符串格式的数值输入,且能精确识别)。
修正后的精度处理函数
from decimal import Decimal, ROUND_DOWN def __get_trimmed_quantity(self, quantity): self.logger.log("untrimmed qty: ", quantity) quantity_dec = Decimal(str(quantity)) step_size_dec = Decimal(str(self.step_size)) # 按step_size截断数值(可选ROUND_HALF_UP,根据需求调整舍入模式) trimmed_quantity_dec = quantity_dec.quantize(step_size_dec, rounding=ROUND_DOWN) # 返回字符串格式,彻底避免float精度问题 return str(trimmed_quantity_dec) def __get_trimmed_price(self, price): self.logger.log("untrimmed price: ", price) price_dec = Decimal(str(price)) tick_size_dec = Decimal(str(self.tick_size)) trimmed_price_dec = price_dec.quantize(tick_size_dec, rounding=ROUND_DOWN) return str(trimmed_price_dec)
订单提交注意事项
构造订单参数时,直接使用上述函数返回的字符串,禁止转成float:
order_params = { 'side': 'SELL', 'positionSide': 'SHORT', 'type': 'LIMIT', 'timeInForce': 'GTC', 'quantity': self.__get_trimmed_quantity(0.28760622), 'price': self.__get_trimmed_price(26193.02), 'newClientOrderId': '35021e7298b34c838f0b64e291ead9e1' }
额外验证步骤
- 打印处理后的字符串参数,确认数值小数位严格匹配
step_size和tick_size的要求,无冗余位数。 - 确认exchange info的正确性:如果是合约交易,要确保获取的是合约交易对的规格参数,而非现货交易对的。
内容的提问来源于stack exchange,提问作者Juan Chaher
相关产品推荐
相关产品推荐

