2015-04-30 3 views
-1
amount = 0.002638309660058967 
price = 1392.18 

lowest_ask = 1391.6 

result = price*amount/lowest_ask 

print(result) 

Приведенный выше код выведет:всплывают округлении проблемы в питоне

0.002639409271731024 

Однако, когда я выполнить расчет здесь: http://web2.0calc.com/ Это дает мне: 0,0026394092717310237698

Так, очевидно, питон округление результат этого расчета ....

Мой вопрос в том, как вы предотвращаете округление результата python? то есть я хочу получить результат: 0.002639409271731023

+1

Может ли https://docs.python.org/2/library/decimal.html помочь? – Shadow

ответ

2

Python использует 64-разрядную плавающую точку IEEE для выполнения вычислений. Вы можете получить его, чтобы распечатать столько цифр, сколько хотите, но что более поздние цифры не будут иметь смысла, так как существует только так много, что может быть представлено в 64-битных.

>>> print "{0:.30f}".format(result) 
0.002639409271731024079349348099 

Если вы хотите больше цифр точности, то вы не сможете использовать тип float. В этом случае вы можете использовать десятичный модуль, но вычисления будут намного медленнее.

Если идти по пути использования десятичную модуля, то вот код с по умолчанию 28 цифр точности:

from decimal import * 
amount = Decimal('0.002638309660058967') 
price = Decimal('1392.18') 
lowest_ask = Decimal('1391.6') 
result = price*amount/lowest_ask 
print(result) 

0.002639409271731023769804541535 
0

Поскольку ваш пример связан с небольшими финансовыми операциями, то decimal модуль является хороший выбор (см. предыдущий ответ). Для научных вычислений с высоким акцентом на скорости, вы могли бы использовать некоторые произвольной точности модуль как gmpy:

from gmpy import mpf 
amount = mpf('0.002638309660058967') 
price = mpf('1392.18') 
lowest_ask = mpf('1391.6') 
result = price*amount/lowest_ask 
print(result) 

0,0026394092717310237698

(конечно, вы можете использовать столько цифр, сколько хотел). Для вычислений с фиксированным количеством точности ~ 32 или ~ 64 десятичных цифр модуль qd также является хорошим выбором.