如何根据某些条件舍入(或削减)浮点数
How to round (or perhaps cut) of a float based on some conditions
我正在尝试制作一个加密货币机器人,但遇到了一个问题。我想根据交易所的数据对余额进行四舍五入,否则交易所不接受订单请求。例如,我的账户包含 0.0044859999999999995 btc,交易所 Stepsize(舍入因子的奇特名称)是 0.00000100,我如何获得 0.004485 而不是四舍五入,因为那样交易所会出错。
我试过用下面的 code.but 不工作
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 `
使用 decimal.Decimal
而不是使用该语言的原生 float
类型会更好,后者很容易出现准确性错误。
我敢打赌,0.0044859999999999995 btc
实际上是作为一个非常大的较小单位整数提供给您的(不确定 btc,但对于 eth,这些单位称为 wei).
如果情况确实如此,那么您应该努力保持这种方式,并且只使用整数进行所有数学运算(即,甚至不使用 Decimal
,只是普通整数和 //
在需要的地方进行操作)。
如果您坚持使用 non-integer 值,那么您可以将代码修改为:
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
from decimal import Decimal, ROUND_DOWN
num = Decimal('0.0044859999999999995')
numCoins = num.quantize(Decimal('0.000001'), rounding=ROUND_DOWN)
print(numCoins) # Decimal('0.004485')
这应该适合你。
试试这个:
>>> 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
>>>
我正在尝试制作一个加密货币机器人,但遇到了一个问题。我想根据交易所的数据对余额进行四舍五入,否则交易所不接受订单请求。例如,我的账户包含 0.0044859999999999995 btc,交易所 Stepsize(舍入因子的奇特名称)是 0.00000100,我如何获得 0.004485 而不是四舍五入,因为那样交易所会出错。 我试过用下面的 code.but 不工作
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 `
使用 decimal.Decimal
而不是使用该语言的原生 float
类型会更好,后者很容易出现准确性错误。
我敢打赌,0.0044859999999999995 btc
实际上是作为一个非常大的较小单位整数提供给您的(不确定 btc,但对于 eth,这些单位称为 wei).
如果情况确实如此,那么您应该努力保持这种方式,并且只使用整数进行所有数学运算(即,甚至不使用 Decimal
,只是普通整数和 //
在需要的地方进行操作)。
如果您坚持使用 non-integer 值,那么您可以将代码修改为:
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
from decimal import Decimal, ROUND_DOWN
num = Decimal('0.0044859999999999995')
numCoins = num.quantize(Decimal('0.000001'), rounding=ROUND_DOWN)
print(numCoins) # Decimal('0.004485')
这应该适合你。
试试这个:
>>> 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
>>>