将浮点数转换为保留十进制的 str() 表示形式



我正在尝试对decimal.Decimal进行子类化,以便将浮点数视为字符串,而字符串又被视为小数。

而不是:

>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')

我将浮点数转换为 str,然后转换为十进制:

>>> decimal.Decimal(str(1.1))
Decimal('1.1')

由于我发现自己经常这样做,所以我决定对十进制进行子类。但是以下代码在 Python 3.6.4 中抛出了一个异常:

import decimal
class D(decimal.Decimal):
    def __new__(self, value="0", context=None):
        value = str(value)
        super().__new__(value, context)
d = D(1.1)
print(d)

追踪:

Traceback (most recent call last):
  File "C:/Users/Better/.PyCharmCE2018.1/config/scratches/scratch_4.py", line 8, in <module>
    d = D(1.1)
  File "C:/Users/Better/.PyCharmCE2018.1/config/scratches/scratch_4.py", line 6, in __new__
    super().__new__(value, context)
TypeError: decimal.Decimal.__new__(X): X is not a type object (str)

解决方案是什么?

你把错误的参数传递给__new__,你没有返回任何东西。

有关如何使用__new__的文档

class D(decimal.Decimal):
    def __new__(cls, value="0", context=None):
        value = str(value)
        return super().__new__(cls, value, context)

话虽如此,您可能应该在此处使用__init__,因为您没有进行任何需要使用__new__的类类型操作。

class D(decimal.Decimal):
    def __init__(self, value="0", context=None):
        value = str(value)
        super().__init__(self, value, context)

尝试:

super().__new__(self, value, context)

def __new__(self, value="0", context=None):需要三个位置参数,selfvaluecontext

当你这样做时super().__new__(value, context) self(从你的函数(变得value并且context变得value,不需要定义最后两个值来使用该函数,所以没有什么提醒你这一点, context实际上永远不会传递给super().__new__()

最新更新