Как округлить (или, возможно, вырезать) поплавок, основываясь на некоторых условиях - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать криптовалютного бота и застрял в проблеме.Я хочу округлить остатки на основе данных от обмена, потому что в противном случае обмен не принимает запрос заказа.Например, мой счет содержит 0,0044859999999999995 BTC, а значение шага обмена (причудливое имя для коэффициента округления) равно 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 голосов
/ 26 мая 2019
from decimal import Decimal, ROUND_DOWN

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

Это должно для вас.

0 голосов
/ 29 мая 2019

Попробуйте это:

>>> 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 голосов
/ 26 мая 2019

Вам было бы намного лучше работать с 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
...