python - 类型错误 : unsupported operand type(s) for/: 'Decimal' and 'float'

标签 python floating-point

这是我的代码:我已经尝试了一整天来解决该错误,但仍然有错误:

TypeError: unsupported operand type(s) for /: 'Decimal' and 'float'.

from math import sqrt, acos, pi

from decimal import Decimal, getcontext

getcontext().prec = 30

class Vector(object):

    CANNOT_NORMALIZE_ZERO_VECTOR_MSG = 'Cannot compute an angle with the zero vector'

    def __init__(self, coordinates):
        try:
            if not coordinates:
                raise ValueError
            self.coordinates = tuple(Decimal(x) for x in coordinates)
            self.dimension = len(self.coordinates)

        except ValueError:
            raise ValueError('The coordinates must be nonempty')

        except TypeError:
            raise TypeError('The coordinates must be an iterable')
    #orthogonal or parallel
    def is_zero(self, tolerance=1e-10):
        return self.magnitude() < tolerance

    def is_orthogonal_to(self, v, tolerance=1e-10):
        return abs(self.dot(v)) < tolerance

    def is_parallel_to(self, v):
        return ( self.is_zero() or 
                v.is_zero() or
                self.angle_with(v) == 0 or
                self.angle_with(v) == pi )

    #dot product &angle
    def dot(self, v):
        return sum([x*y for x,y in zip(self.coordinates,v.coordinates)])
    def angle_with(self,v,in_degrees=False):
        try:
            u1 = self.normalized()
            u2 = v.normalized()
            angle_in_radians = acos(u1.dot(u2))

            if in_degrees:
                degrees_per_radian = 180./pi
                return angle_in_radians * degrees_per_radian
            else:
                return angle_in_radians

        except Exception as e:
            if str(e) == self.CANNOT_NORMALIZE_ZERO_VECTOR_MSG:
                raise Exception('Cannot compute an angle with the zero vector')
            else:
                raise e


    #magnitude& Direction
    def magnitude(self):
        coordinates_squared = [x**2 for x in self.coordinates]
        return sqrt(sum(coordinates_squared))
    def normalized(self):
        try:
            magnitude = self.magnitude()
            return self.times_scalar(Decimal('1.0')/magnitude)
        except ZeroDivisionError:
            raise Exception(self.CANNOT_NORMALIZE_ZERO_VECTOR_MSG)
    #Plus,minus, scalar multiply
    def plus(self, v):
        new_coordinates = [x+y for x,y in zip(self.coordinates,v.coordinates)]
        return Vector(new_coordinates)
    def minus(self, v):
        new_coordinates = [x-y for x,y in zip(self.coordinates,v.coordinates)]
        return Vector(new_coordinates)
    def times_scalar(self, c):
        new_coordinates = [Decimal(c)*x for x in self.coordinates]
        return Vector(new_coordinates)

    def __str__(self):
        return 'Vector: {}'.format(self.coordinates)

    def __eq__(self, v):
        return self.coordinates == v.coordinates

v = Vector(['8','-9'])

w = Vector(['-1','-1'])

print v.dot(w)

print v.angle_with(w)

print v.angle_with(w, in_degrees=True)

最佳答案

一般来说,混合使用十进制浮点数学通常没有意义。不确定为什么这里需要 Decimal,但只需进行两个小更改即可运行此代码。我建议考虑摆脱 Decimal 除非您确定需要它:

将幅度更改为:

# magnitude& Direction
def magnitude(self):
    coordinates_squared = [x ** 2 for x in self.coordinates]
    return sum(coordinates_squared) ** Decimal('0.5')

acos 调用:

angle_in_radians = Decimal(str(acos(u1.dot(u2))))

关于python - 类型错误 : unsupported operand type(s) for/: 'Decimal' and 'float' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50428901/

相关文章:

java - 使用 Py4j 将 Python 对象发送到 Java

python - 行为异常的numpy矩阵的Python列表

在C中将2字节或3字节转换为 float

ruby-on-rails - Rails 3 GPS 坐标的 float 或十进制数

python - 如何制作阴影贴图?

python - 如何使用 Python 3.6 遍历图像文件夹并在 Jupyter Notebook 中内联打印图像

c - float的printf如何不打印正确的浮点值

将二进制转换为 float

ios - 两个数字之间的随机 float ?

python - TF 中的索引操作