python2.4.3: ошибка формата? - PullRequest
4 голосов
/ 28 января 2011

Вот пример:

>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'

Почему они дают другой результат?

Ответы [ 3 ]

6 голосов
/ 28 января 2011

Это не ошибка формата. Это просто арифметика с плавающей точкой. Посмотрите на значения, лежащие в основе ваших команд форматирования:

In [18]: float('0.00355')
Out[18]: 0.0035500000000000002

In [19]: float('0.00355')*100
Out[19]: 0.35500000000000004

In [20]: 0.355
Out[20]: 0.35499999999999998

Два выражения создают разные значения.

Я не знаю, доступен ли он в версии 2.4, но вы можете использовать десятичный модуль для этой работы:

>>> import decimal
>>> "%.2f" % (decimal.Decimal('0.00355')*100)
'0.35'

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

4 голосов
/ 28 января 2011

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

Даже если бы мы сходили с ума и имели65536-битные форматы с плавающей запятой, число чисел от 0 до 1 все еще, ... ну, бесконечно: -)

Почти наверняка происходит то, что первое немного ниже 0,355 (скажем, 0,3549999999999), в то время как второй немного выше (скажем, 0,3550000001).

См. здесь для дальнейшего чтения по теме.

Хороший инструмент для работы с числами с плавающей запятой Превосходный онлайн-конвертер Харальда Шмидта .Это было так удобно, что я также реализовал свой собственный C # one, способный обрабатывать как IEEE754 одинарной , так и двойной точности.

1 голос
/ 28 января 2011

Арифметика с числами с плавающей запятой часто неточна.

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

...