[英]Python default behavior of str(x)
我依賴於一些使用Decimal類的代碼,因為它需要精確到一定數量的小數位。 某些函數允許輸入為浮點數,因為它與代碼庫的其他部分接口的方式。 要將它們轉換為十進制對象,它會使用類似的東西
mydec = decimal.Decimal(str(x))
其中x是作為輸入的浮點數。 我的問題是,是否有人知道應用於浮點數的'str'方法的標准是什么?
例如,取數字2.1234512。 由於表示浮動的方式,它在內部存儲為2.12345119999999999。
>>> x = 2.12345119999999999
>>> x
2.1234511999999999
>>> str(x)
'2.1234512'
好的,在這種情況下,str(x)正在執行類似'%。6f'%x的操作。 這是我的代碼轉換為小數的方式的問題。 請考慮以下事項:
>>> d = decimal.Decimal('2.12345119999999999')
>>> ds = decimal.Decimal(str(2.12345119999999999))
>>> d - ds
Decimal('-1E-17')
所以,如果我有浮動,2.12345119999999999,我想將它傳遞給Decimal,使用str()將其轉換為字符串會得到錯誤的答案。 我需要知道str(x)的規則是什么,它決定了格式化的內容,因為我需要確定是否需要重寫這段代碼以避免這個錯誤(注意它可能沒問題,因為,對於例如,一旦我們有一個小數對象,代碼可能會舍入到第10個小數位)
在python的文檔中必須有一些規則,希望有人可以指點我。 謝謝!
在Python源代碼中,查看“Include / floatobject.h”。 字符串轉換的精度在評論后從頂部設置幾行,並對選項進行了一些解釋:
/* The str() precision PyFloat_STR_PRECISION is chosen so that in most cases,
the rounding noise created by various operations is suppressed, while
giving plenty of precision for practical use. */
#define PyFloat_STR_PRECISION 12
如果您需要不同的東西,您可以選擇重建。 任何更改都將更改浮點數和復數的格式。 請參閱./Objects/complexobject.c和./Objects/floatobject.c。 此外,您可以比較repr和str轉換在這兩個文件中的兩倍之間的差異。
這里有一些值得討論的問題,但摘要是: 您無法提取尚未存儲在系統中的信息 。
如果您使用了十進制數並將其存儲為浮點數,那么您將丟失信息,因為大多數十進制(基數為10)的數字具有有限位數,無法使用基數2中的有限位數進行存儲(二進制)。
如前所述, str(a_float)
將真正調用a_float.__str__()
。 正如文檔所述,該方法的目的是
返回一個包含對象的可打印表示的字符串
float
箱沒有特別的定義。 我的意見是,出於您的目的,您應該認為__str__
的行為是未定義的 ,因為沒有關於它的官方文檔 - 當前的實現可以隨時更改。
如果您沒有原始字符串,則無法從float
對象中提取小數表示的缺失數字。 所有你能做的就是使用字符串格式(你提到) 可預測的圓形 :
Decimal( "{0:.5f}".format(a_float) )
您也可以使用resulting_string.rstrip("0")
刪除右側的resulting_string.rstrip("0")
。 同樣,此方法不會恢復已丟失的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.