Учитывая ваш вектор
(-379.99418604651157, 47.517234218543351, 0.0) #representing point x
Самый простой способ выполнить округление, который работает, как и следовало ожидать, вероятно, будет использовать десятичную модуль: http://docs.python.org/library/decimal.html ,
from decimal import Decimal:
point = (-379.99418604651157, 47.517234218543351, 0.0) #representing point x
converted = [Decimal(str(x)) for x in point]
Затем, чтобы получить приближение, вы можете использовать метод квантования:
>>> converted[0].quantize(Decimal('.0001'), rounding="ROUND_DOWN")
Decimal("-379.9941")
Этот подход имеет преимущество встроенной возможности избежать ошибок округления. Надеюсь, это полезно.
Edit:
Осмотрев свой комментарий, это выглядит, как вы пытаетесь увидеть, если две точки находятся близко друг к другу. Эти функции могут делать то, что вы хотите:
def roundable(a,b):
"""Returns true if a can be rounded to b at any precision"""
a = Decimal(str(a))
b = Decimal(str(b))
return a.quantize(b) == b
def close(point_1, point_2):
for a,b in zip(point_1, point_2):
if not (roundable(a,b) or roundable(b,a)):
return False
return True
Я не знаю, если это лучше, чем эпсилон подход, но это довольно просто реализовать.
from fpformat import fix – Ant
@Ant: 'fix()' возвращает строку. Кроме того, 'fpformat' устарел с Pyhon 2.6 и удален в Python 3. –
Я знал, что исправление возвращает строку, но не то, что она устарела; спасибо – Ant