簡體   English   中英

Python的默認行為str(x)

[英]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.

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