首页 > 解决方案 > 如何控制从自定义对象到 numpy.longdouble 的转换?

问题描述

我有一个自定义类(由于历史原因)将高精度数字存储为两个整数,表示整数部分和纳米精度非整数部分,例如:

class Custom(object):
    def __init__(self, int_, nano_):
        self._int = int_
        self._nano = nano_

    def __float__(self):
        return self._int + self._nano * 1e-9

    def __int__(self):
        return self._int

但是,当我尝试将其转换为它时,numpy.longdouble它正在通过该__float__方法:

>>> a = Custom(1234567890, 123456789)
>>> print(numpy.longdouble(a))
1234567890.1234567165
>>> print(numpy.longdouble(float(a)))
1234567890.1234567165
>>> print(numpy.longdouble(a._int) + numpy.longdouble(a._nano * 1e-9))
1234567890.123456789

最后一个例子就是我想要的结果。所以问题是,如何覆盖强制转换为的默认行为numpy.longdouble

标签: pythonnumpy

解决方案


我认为它现在不可行,因为中间float演员是不可避免的(有关详细信息,请参阅此问题)。虽然floattype 无法保留这种长数字小数的精度(请查看表示float获取详细信息)。

一种解决方法是“覆盖”该numpy.longdouble功能:

class Custom(object):
    def __init__(self, int_, nano_):
        self._int = int_
        self._nano = nano_

    def __float__(self):
        return self._int + self._nano * 1e-9

    def longdouble(self):
        return numpy.longdouble(a._int) + numpy.longdouble(a._nano * 1e-9)

    def __int__(self):
        return self._int

a = Custom(1234567890, 123456789)
print(a.longdouble())

推荐阅读