如何根据某些条件对浮子进行四舍五入

时间:2019-05-26 10:33:13

标签: python bots cryptocurrency binance

我正在尝试制作一个加密货币机器人,但我遇到了问题。我想根据交易所的数据取整余额,因为否则交易所不接受订单请求。例如,我的帐户包含0.0044859999999999995 btc,而交易所的Stepsize(舍入因子的奇特名称)为0.00000100,我如何获得0.004485而不进行舍入,因为这样交易所会出错。 我尝试使用以下代码进行操作,但不起作用

import sys, signal, json, time
import random
import math
num = 0.0044859999999999995
numCoins = num - math.fmod(num, 0.000001)
print (numCoins) # want to get 0.004485 `

3 个答案:

答案 0 :(得分:0)

使用decimal.Decimal而不是使用语言的本机float类型会好得多,因为这种类型一开始会出现准确性错误。

我也敢打赌,0.0044859999999999995 btc实际上是作为较大整数的较小单位提供给您的(不确定btc,但是对于eth,这些单位称为 wei

如果确实如此,那么您应该努力保持这种状态,并仅使用整数来进行所有数学运算(即,甚至不使用Decimal,仅使用纯整数和//操作)所需的地方。)

如果您坚持使用非整数值,则可以将代码修改为此:

from decimal import Decimal
from decimal import getcontext
from decimal import ROUND_DOWN

getcontext().prec = 100
getcontext().rounding = ROUND_DOWN

num = Decimal('0.0044859999999999995')
numCoins = Decimal(int(num*1000000))/1000000

答案 1 :(得分:0)

from decimal import Decimal, ROUND_DOWN

num = Decimal('0.0044859999999999995')
numCoins = num.quantize(Decimal('0.000001'), rounding=ROUND_DOWN)
print(numCoins)  # Decimal('0.004485')

这应该适合您。

答案 2 :(得分:0)

尝试一下:

>>> import decimal
>>> decimal.getcontext().rounding = decimal.ROUND_DOWN
>>> decimal.getcontext().prec = 28
>>> amount = decimal.Decimal('0.0044859999999999995')
>>> step = decimal.Decimal('0.00000100')
>>> rounded_amount=int(amount/step)*step
>>> print(rounded_amount)
0.00448500
>>>