Ограничения с плавающей точкой - PullRequest
5 голосов
/ 02 января 2009

Мой код:

a = '2.3'

Я хотел отобразить a как значение с плавающей запятой.

Поскольку a является строкой, я попытался:

float(a)

Результат, который я получил:

2.2999999999999998

Я хочу решить эту проблему. Пожалуйста, помогите мне.

Я читал этот урок .

Ответы [ 3 ]

18 голосов
/ 02 января 2009

Я думаю, что это больше отражается на вашем понимании типов с плавающей запятой, чем на Python. См. мою статью о числах с плавающей запятой (основанную на .NET, но все еще актуальную) по причинам этой "неточности". Если вам нужно сохранить точное десятичное представление, вы должны использовать десятичный модуль .

6 голосов
/ 02 января 2009

Это не недостаток Python, скорее, это недостаток способа хранения чисел с плавающей запятой на компьютере. Независимо от языка реализации вы найдете похожие проблемы.

Вы говорите, что хотите «отобразить» A как плавающую точку, почему бы просто не отобразить строку? Визуально это будет идентично тому, что вы ожидаете.

Как упоминал Джон, если ваши потребности - это не просто отображение числа с плавающей запятой, вы должны использовать десятичный модуль для хранения точного представления.

4 голосов
/ 02 января 2009

Отличные ответы, объясняющие причины. Я просто хочу добавить возможное практическое решение из стандартной библиотеки:

>>> from decimal import Decimal
>>> a = Decimal('2.3')
>>> print a
2.3

Это на самом деле (очень) Ф.А.К. для Python и вы можете прочитать ответ здесь .

<ч /> Изменить: я только что заметил, что Джон Скит уже упоминал об этом. Ну да ладно ...

...