2013-03-31 14 views
6

Czy ktoś może wyjaśnić mi ten pice kodu:Zachowanie funkcji „okrągłego” w Pythonie

>>> round(0.45, 1) 
0.5 
>>> round(1.45, 1) 
1.4 
>>> round(2.45, 1) 
2.5 
>>> round(3.45, 1) 
3.5 
>>> round(4.45, 1) 
4.5 
>>> round(5.45, 1) 
5.5 
>>> round(6.45, 1) 
6.5 
>>> round(7.45, 1) 
7.5 
>>> round(8.45, 1) 
8.4 
>>> round(9.45, 1) 
9.4 

Updated

Myślę, że to z powodu pływającej reprezentacji. Czy mam rację?

+0

samo zjawisko w 2.7.2 – frickskit

+1

Related: http://stackoverflow.com/questions/10825926/python-3-x-rounding-behavior. Odpowiedź jest tutaj: http://stackoverflow.com/a/10093820/1258041 –

+0

@SperanskyDanil Masz rację, przepraszam, to nie to samo –

Odpowiedz

8

Masz rację. Żadna z liczb nie może być dokładnie odwzorowana. W niektórych przypadkach część ułamkowa jest większa niż ściśle 0.45 aw niektórych jest ściśle mniej:

In [4]: ['%.20f' % val for val in (0.45, 1.45, 2.45, 3.45, 4.45, 5.45, 6.45, 7.45, 8.45, 9.45)] 
Out[4]: 
['0.45000000000000001110', 
'1.44999999999999995559', 
'2.45000000000000017764', 
'3.45000000000000017764', 
'4.45000000000000017764', 
'5.45000000000000017764', 
'6.45000000000000017764', 
'7.45000000000000017764', 
'8.44999999999999928946', 
'9.44999999999999928946'] 

To wyjaśnia pozornie niespójne zaokrąglenia.

0

jako NPE powiedział binarna reprezentacja liczby dziesiętnej nie jest dokładna, dzięki czemu można uzyskać dziwne zachowanie z zaokrągleń, moduł, który rozwiązuje ten problem jest dziesiętny, Here is the official documentation

Powiązane problemy