2009-08-23 2 views
60

Я делаю программу, которая по причинам, не требующим объяснения, требует, чтобы поплавок был преобразован в строку, которую нужно пересчитать с помощью len(). Однако str (float (x)) приводит к округлению x при преобразовании в строку, что исключает все. Кто-нибудь знает об этом? Вот код используется, если вы хотите знать:Преобразование float в строку без округления

len(str(float(x)/3)) 
+2

если х изначально ули, почему актеры? –

+1

-1: Нет примеров требуемого вывода для разных значений 'x'. Без примеров мы можем только догадываться, в чем проблема. –

ответ

92

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

Например:

>>> .1 
0.10000000000000001 

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

>>> repr(.1) 
'0.10000000000000001' 

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

>>> str(.1) 
'0.1' 

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

например.

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

Documentation here.

10
len(repr(float(x)/3)) 

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

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

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

Объяснение, почему это происходит в this chapter из питона учебника.

Решение будет использовать тип, который специально отслеживает десятичных чисел, как в Python decimal.Decimal:

>>> print len(str(decimal.Decimal('0.1'))) 
3 
+3

+1 для десятичной дроби. –

+0

Хороший пост, касающийся того, как работать с поплавком результатов из раздела: https://stackoverflow.com/questions/2958684/python-division – Trutane

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.

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

 Смежные вопросы

  • Нет связанных вопросов^_^