Я делаю программу, которая по причинам, не требующим объяснения, требует, чтобы число с плавающей запятой было преобразовано в строку для подсчета с помощью len (). Однако str (float (x)) приводит к округлению x при преобразовании в строку, что отбрасывает все. Кто-нибудь знает, как исправить это? Вот код, который используется, если вы хотите знать:
len(str(float(x)/3))
python
string
floating-point
rounding
Галилео
источник
источник
x
. Без примеров мы можем только догадываться, в чем проблема.Ответы:
Некоторая форма округления часто неизбежна при работе с числами с плавающей запятой. Это связано с тем, что числа, которые вы можете точно выразить в базе 10, не всегда могут быть точно выражены в базе 2 (которую использует ваш компьютер).
Например:
>>> .1 0.10000000000000001
В этом случае вы видите преобразование .1 в строку с использованием
repr
:>>> repr(.1) '0.10000000000000001'
Я считаю, что python отбрасывает последние несколько цифр, когда вы используете str (), чтобы обойти эту проблему, но это частичный обходной путь, который не заменяет понимание того, что происходит.
>>> str(.1) '0.1'
Я не совсем уверен, какие проблемы вызывает "округление". Возможно, вам лучше подойдет форматирование строк как способ более точного управления выводом?
например
>>> '%.5f' % .1 '0.10000' >>> '%.5f' % .12345678 '0.12346'
Документация здесь .
источник
len(repr(float(x)/3))
Однако я должен сказать, что это не так надежно, как вы думаете.
Поплавки вводятся / отображаются как десятичные числа, но ваш компьютер (фактически, ваша стандартная библиотека C) хранит их как двоичные. Вы получаете некоторые побочные эффекты от этого перехода:
>>> print len(repr(0.1)) 19 >>> print repr(0.1) 0.10000000000000001
Объяснение того, почему это происходит, находится в этой главе учебника по python.
Решением было бы использовать тип, который специально отслеживает десятичные числа, например python
decimal.Decimal
:>>> print len(str(decimal.Decimal('0.1'))) 3
источник
В других ответах уже указывалось, что представление плавающих чисел - это, мягко говоря, непростая проблема.
Поскольку вы не указываете достаточно контекста в своем вопросе, я не могу знать, может ли десятичный модуль быть полезным для ваших нужд:
http://docs.python.org/library/decimal.html
Помимо прочего, вы можете явно указать точность, которую хотите получить (из документации):
>>> getcontext().prec = 6 >>> Decimal('3.0') Decimal('3.0') >>> Decimal('3.1415926535') Decimal('3.1415926535') >>> Decimal('3.1415926535') + Decimal('2.7182818285') Decimal('5.85987') >>> getcontext().rounding = ROUND_UP >>> Decimal('3.1415926535') + Decimal('2.7182818285') Decimal('5.85988')
Простой пример из моего приглашения (python 2.6):
>>> import decimal >>> a = decimal.Decimal('10.000000001') >>> a Decimal('10.000000001') >>> print a 10.000000001 >>> b = decimal.Decimal('10.00000000000000000000000000900000002') >>> print b 10.00000000000000000000000000900000002 >>> print str(b) 10.00000000000000000000000000900000002 >>> len(str(b/decimal.Decimal('3.0'))) 29
Может это поможет? decimal находится в python stdlib с версии 2.4, с дополнениями в python 2.6.
Надеюсь, это поможет, Франческо
источник
Я знаю, что уже слишком поздно, но для тех, кто приезжает сюда впервые, я хотел бы опубликовать решение. У меня есть значение с плавающей запятой
index
и строка,imgfile
и у меня была та же проблема, что и у вас. Вот как я исправил проблемуindex = 1.0 imgfile = 'data/2.jpg' out = '%.1f,%s' % (index,imgfile) print out
На выходе
1.0,data/2.jpg
Вы можете изменить этот пример форматирования по своему усмотрению.
источник