将浮点数转换为十进制保留 str() 表示
Convert float to Decimal preserving str() representation
我正在尝试对 decimal.Decimal
进行子类化,以便浮点数被视为字符串,而字符串又被视为小数。
而不是:
>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
我将 float 转换为 str,后者又转换为 Decimal:
>>> decimal.Decimal(str(1.1))
Decimal('1.1')
因为我发现自己经常这样做,所以我决定将 Decimal 子类化。但是下面的代码在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)
解决方法是什么?
尝试:
super().__new__(self, value, context)
def __new__(self, value="0", context=None):
需要三个位置参数,self
、value
和 context
.
当您执行 super().__new__(value, context)
self
(从您的函数)变为 value
并且 context
变为 value
时,最后两个值不需要被定义为使用该功能,因此没有任何提醒你这一点,
context
从未真正传递给 super().__new__()
您向 __new__
传递了错误的参数,并且没有返回任何内容。
Documentation on how to use __new__
class D(decimal.Decimal):
def __new__(cls, value="0", context=None):
value = str(value)
return super().__new__(cls, value, context)
也就是说,您应该在这里使用 __init__
,因为您没有进行任何需要使用 __new__
.[=17= 的 class 类型操作]
class D(decimal.Decimal):
def __init__(self, value="0", context=None):
value = str(value)
super().__init__(self, value, context)
我正在尝试对 decimal.Decimal
进行子类化,以便浮点数被视为字符串,而字符串又被视为小数。
而不是:
>>> decimal.Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
我将 float 转换为 str,后者又转换为 Decimal:
>>> decimal.Decimal(str(1.1))
Decimal('1.1')
因为我发现自己经常这样做,所以我决定将 Decimal 子类化。但是下面的代码在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)
解决方法是什么?
尝试:
super().__new__(self, value, context)
def __new__(self, value="0", context=None):
需要三个位置参数,self
、value
和 context
.
当您执行 super().__new__(value, context)
self
(从您的函数)变为 value
并且 context
变为 value
时,最后两个值不需要被定义为使用该功能,因此没有任何提醒你这一点,
context
从未真正传递给 super().__new__()
您向 __new__
传递了错误的参数,并且没有返回任何内容。
Documentation on how to use __new__
class D(decimal.Decimal):
def __new__(cls, value="0", context=None):
value = str(value)
return super().__new__(cls, value, context)
也就是说,您应该在这里使用 __init__
,因为您没有进行任何需要使用 __new__
.[=17= 的 class 类型操作]
class D(decimal.Decimal):
def __init__(self, value="0", context=None):
value = str(value)
super().__init__(self, value, context)