你是混亂的字符串演示與實際內容。沒有任何地方會丟失精確度,只有生成寫入控制檯的字符串使用四捨五入的值,而不是顯示所有數字。永遠記住浮點數是數字近似值,而不是精確值。
當使用str()
和repr()
函數時,Python浮點格式不同;在列表或其他容器中,使用repr()
,但直接打印並使用str()
。
如果你不喜歡任何一個選項,格式它明確地與format()
function並指定精度:
print format(maxState, '.12f')
8個小數將其打印出來,例如。
演示:
>>> maxState = -34.67875545008369
>>> repr(maxState)
'-34.67875545008369'
>>> str(maxState)
'-34.6787554501'
>>> format(maxState, '.8f')
'-34.67875545'
>>> format(maxState, '.12f')
'-34.678755450084'
的repr()
輸出是大致相當於使用'.17g'
作爲格式,而str()
相當於'.12g'
;此處的精度表示何時使用科學記數法(e
)以及何時以浮點表示法(f
)顯示。
我說大致,因爲repr()
輸出的目的是爲您提供round-trippable輸出;請參閱change notes for Python 3.1 on float()
representation,其中回傳到Python 2.7:
什麼是新的是如何顯示數字。以前,Python使用了一種簡單的方法。 repr(1.1)
的值計算爲format(1.1, '.17g')
,其評估爲'1.1000000000000001'
。使用17位數字的優勢在於它依賴於IEEE-754的保證,以確保eval(repr(1.1))
能夠完全到達其原始值。缺點是很多人發現輸出很混亂(將二進制浮點表示的內在侷限性誤認爲是Python本身的一個問題)。
repr(1.1)
的新算法更智能,並返回'1.1'
。實際上,它會搜索所有等價的字符串表示(存儲具有相同基礎浮點值的字符串表示)並返回最短表示。
@Flav:將浮點數值放入一個容器中,重現它是微不足道的。 – 2014-10-18 16:13:33
是的,我忘了實際使用「打印」 – 2014-10-18 16:25:34