[英]Convert float to Decimal preserving str() representation
我正在嘗試將decimal.Decimal
子類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__
並且沒有返回任何內容。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.