Поведение функции «round» в Python

Может ли кто-нибудь объяснить мне этот код кода:

>>> 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 

обновленный

Я думаю, это из-за плавающего представления. Я прав?

Ты прав. Ни одно из чисел не может быть представлено точно. В некоторых случаях дробная часть строго больше 0.45 а в некоторых она строго меньше:

 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'] 

Это объясняет, казалось бы, непоследовательное округление.

поскольку NPE говорит, что двоичное представление десятичного числа не является точным, поэтому вы можете получить странное поведение от округления, модуль, который решает эту проблему, десятичен. Вот официальная документация