2014-10-18 106 views
0

我有一個名爲「變量 - 日誌概率分數」的列表。python中精度浮點數的丟失

當我調用這個函數:

maxState = scores.pop(scores.index(max(scores))) 

和打印maxState,我意識到maxState失去了它的精度浮點數。有沒有一種方法可以在不失精度的情況下獲得maxState?

恩:我打印出來的清單得分:[-35.7971525669589, -34.67875545008369] 和打印maxState,我得到這個:-34.6787554501 (你可以看到它的四捨五入)

+0

@Flav:將浮點數值放入一個容器中,重現它是微不足道的。 – 2014-10-18 16:13:33

+0

是的,我忘了實際使用「打印」 – 2014-10-18 16:25:34

回答

2

你是混亂的字符串演示與實際內容。沒有任何地方會丟失精確度,只有生成寫入控制檯的字符串使用四捨五入的值,而不是顯示所有數字。永遠記住浮點數是數字近似值,而不是精確值。

當使用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'。實際上,它會搜索所有等價的字符串表示(存儲具有相同基礎浮點值的字符串表示)並返回最短表示。