2016-04-29 14 views
0
def fc_range(start, end, step=1.0): 
    while start < end: 
     yield start 
     start +=step 
for x in fc_range(0, 1, 0.05): 
    print x # look the ans 
print list(fc_range(0, 1, 0.05)) # compare the ans now 

,當我測試:爲什麼'打印'可以提供一個確切的價值,而其他不是?

>>> 0.1 + 0.05 
0.15000000000000002 

好像是明確的,但爲什麼當我使用print答案不是0.15000000000000002

+0

你是什麼意思「當我使用打印答案不是0.15000000000000002」?是這裏。 – wRAR

回答

2

要下手,浮點數學可能不準確,因爲大多數浮點數不能精確與float表示。

因此,0.1 + 0.15的值不完全是0.25,但有些數字非常接近它。


之所以print爲您提供了一個看似精確的結果是因爲,它採用str得到的結果,這是用戶友好的字符串表示。

>>> str(0.1 + 0.05) 
'0.15' 

Python解釋器,而另一方面,使用repr,它給你的代碼串來表示:

>>> repr(0.1 + 0.05) 
'0.15000000000000002' 
0

這是因爲print來電浮動的引擎蓋下,由於某種原因__str__方法花車上的__str__四捨五入。

+0

你不會真的希望'__str__' *不*要輪迴,你會嗎?例如,沒有任何舍入,「1/100.0」將打印爲「0.01000000000000000020816681711721685132943093776702880859375」。 –

+0

@MarkDickinson那又怎麼了?你更喜歡說謊嗎?隱式舍入至少是令人困惑的。更不用說Python沒有遵循自己的禪宗:「顯性更好,更隱含」。 – freakish

+0

它的問題在於它會爲小型或大型浮標產生瘋狂的數字。例如,如果準確寫入(750位數,指數和小數點),爲'1e-300'存儲的真實值將給出一個長度爲756的字符串。所以是的,在禪宗的精神中:「實踐性擊敗純潔」,並且顯示全部750位數字是不切實際的。 –

相關問題