Преобразование float в строку, без округления его

Я'м делаю программу, которая, по причинам, не нуждающихся в разъяснении, требует поплавка должен быть преобразован в строку, которая будет расценено с LEN(). Однако STR(число с плавающей точкой(х)) результаты в X округления при преобразовании в строку, которая бросает всю штуку. Знает ли кто-нибудь фикс для этого? Здесь'ы код используется, если вы хотите знать:

len(str(float(x)/3))
Комментарии к вопросу (2)
Решение

Какая-то форма округления является часто неизбежным при работе с числами с плавающей запятой. Это потому, что числа, которые можно выразить точно в основание 10 не всегда может быть выражен точно в основание 2 (который ваш компьютер использует).

Например:

>>> .1
0.10000000000000001

В этом случае, вы'вновь увидев .1 преобразуется в строку, используя предст:

>>> repr(.1)
'0.10000000000000001'

Я считаю питон отрубает несколько последних цифр при использовании (ул.) для того, чтобы обойти эту проблему, но это'ы частичное решение, которое не'т заменить понимание того, что's идя дальше.

>>> str(.1)
'0.1'

Я'м не уверен точно, что проблем с "закругления" это вызывает у вас. Возможно, вы могли бы сделать лучше с форматированием строки, как способ более точно контролировать свой выходной?

например

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

Документации.

Комментарии (0)
len(repr(float(x)/3))

Однако я должен сказать, что это'т так надежны, как вы думаете.

Поплавки вводятся/отображается в виде десятичных чисел, а компьютер (по сути, стандартной библиотеки C) сохраняет их в виде двоичных. Вы получаете некоторые побочные эффекты от этого перехода:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

Объяснение о том, почему это происходит в этой главе на языке Python учебник.

В качестве решения можно использовать тип, который специально отслеживает десятичных чисел, таких как Python'ы десятичное.Десятичное:

>>> print len(str(decimal.Decimal('0.1')))
3
Комментарии (1)

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

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

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

Может быть, это может помочь? десятичное число в Python stdlib с 2.4, с дополнениями в Python 2.6.

Надеюсь, что это помогает, Франческо

Комментарии (0)

Я знаю, что это слишком поздно, но для тех, кто приезжает сюда в первый раз, я'd, как запостить решение. У меня есть float значение индекс и строку `imgfile и у меня была такая же проблема как у вас. Вот как я решил вопрос

index = 1.0
imgfile = 'data/2.jpg'
out = '%.1f,%s' % (index,imgfile)
print out

Выход

1.0,data/2.jpg

Вы можете изменить этот пример форматирования как за вашего удобства.

Комментарии (0)