Почему при округлении числа с плавающей точкой 1.4999999999999999 получается 2? - PullRequest
4 голосов
/ 28 апреля 2019

Я читал книгу Пишу отличный код - Понимание машины . В разделе о округлении сказано:

Числа должны быть округлены до наименьшего большего числа, если десятичное битовое значение больше или равно половине общего десятичного значения, которое может быть представлено.

, что означает:

round(1.5) // equals 2
round(1.49) // equals 1

но когда я попробовал это с Python:

x1 = 1.4999  # rounds to 1

x2 = 1.4999999999999999  # rounds to 2

print(round(x1))

print(round(x2))

вывод был:

1

2

Я пытался сделать то же самое с C # и Swift, и он дал тот же результат. Так что я предполагаю, что это не зависящая от языка тема.

Но почему это происходит?

Я предполагаю, что модуль с плавающей запятой округляет дополнительные биты, которые преобразуют "1.4999999999999999999" в "1,5" перед применением округления программиста.

1 Ответ

7 голосов
/ 28 апреля 2019

В x2 = 1.4999999999999999 и print(round(x2)) есть две операции, которые влияют на значение.Функция round не может работать непосредственно с номером 1.4999999999999999 или цифрой «1.4999999999999999».Его операнд должен быть в формате с плавающей точкой, который использует реализация Python.

Итак, сначала, 1.4999999999999999 преобразуется в формат с плавающей точкой.Python не является строгим в отношении того, какой формат с плавающей запятой использует реализация Python, но основной 64-битный двоичный формат IEEE-754 является распространенным.В этом формате наиболее близкими представимыми значениями 1,4999999999999999 являются 1,5 и 1,4999999999999997779553950749686919152736663818359375.Первый из них ближе к 1.4999999999999999, чем последний, поэтому используется первый.

Таким образом, преобразование 1.4999999999999999 в формат с плавающей запятой дает 1,5.Тогда round(1.5) производит 2.

...