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

Выполнение этого слишком долго, чтобы иметь много проблем, но это все еще управляет мной гаек, что я должен бездельничать неподдержка IE вещей CSS как display:table: последний ребенок, и: парение за пределами привязок.

Весь материал IE все еще безумен, но это всего фоновое безумие теперь :)

83
задан aioobe 1 April 2015 в 11:46
поделиться

3 ответа

Некоторая форма округления часто неизбежны при работе с числами с плавающей запятой. Это связано с тем, что числа, которые вы можете точно выразить в базе 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'

Документация здесь .

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

например

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

Документация здесь .

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

например

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

Документация здесь .

122
ответ дан 24 November 2019 в 08:53
поделиться
len(repr(float(x)/3))

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

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

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

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

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

>>> print len(str(decimal.Decimal('0.1')))
3
11
ответ дан 24 November 2019 в 08:53
поделиться

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

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

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.

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

3
ответ дан 24 November 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: