Причина этого заключается в том, что 11,35 проводится как float
, который хранится с использованием двоичного представления чисел с плавающей точкой. И 11.35 нельзя представить точно как двоичное значение с плавающей запятой.
Представляемые двоичные значения с плавающей запятой имеют вид s × 2 e где s и e - целые числа. Обратите внимание, что 11.35 не может быть записано в этой форме. Что происходит в Python при написании 11.35
, так это то, что система использует самое близкое представляемое значение.
closest double precision value to 11.35 является:
11.35 = + 11.34999 99999 99999 64472 86321 19949 90706 44378 66210 9375
Это объясняет, почему round(11.35, 1)
ведет себя, как это делает.
Интересно, что round(11.35, 1)
даже не точно равно 11.3, поскольку 11.3 не является точно представимым с использованием двоичной с плавающей запятой. И так оно продолжается.
Если вы хотите точно указать 11.35, то вам нужно будет хранить его в десятичном типе данных. Стандартная библиотека decimal
- это очевидный способ сделать это в Python. Этот вопрос подробно освещает эту тему: How can I format a decimal to always show 2 decimal places?
Да, у меня есть доступ в Интернет. Но я не нашел чистого способа решить эту проблему. – Robert
Вы все еще застряли? –
[documentation] (https://docs.python.org/2/library/functions.html#round) уже объясняет проблему и дает указатель для дальнейшего чтения. См. Примечание, которое начинается «Поведение round() для поплавков может быть неожиданным: ...». –