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