簡體   English   中英

將float轉換為十進制保留str()表示形式

[英]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):需要三個位置參數, selfvaluecontext

當您執行super().__new__(value, context) self (來自函數)成為value並且context成為value ,不需要定義最后兩個值來使用該函數,因此沒有什么可以提醒您context從未真正傳遞給super().__new__()

您將錯誤的參數傳遞給__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM