Перетворення поплавця в рядок без округлення


88

Я створюю програму, яка з причин, що не потребують пояснення, вимагає перетворення float у рядок для підрахунку за допомогою len (). Однак str (float (x)) призводить до округлення x при перетворенні на рядок, що відкидає всю річ. Хтось знає, як це виправити? Ось код, який використовується, якщо ви хочете знати:

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

2
якщо x спочатку str, чому акторський склад?
Вінко Врсалович

1
-1: Немає прикладів необхідного виводу для різних значень x. Без прикладів ми можемо лише здогадуватися, в чому проблема.
S.Lott

Відповіді:


128

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

Документація тут .


12
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

Гарне сполучення щодо того, як працювати з результатами поплавців від ділення: 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

Може, це може допомогти? десятковий - у python stdlib з 2.4, з доповненнями в python 2.6.

Сподіваюся, це допомагає, Франческо


0

Я знаю, що це занадто пізно, але для тих, хто приїжджає сюди вперше, я хотів би опублікувати рішення. У мене є плаваюче значення indexта рядок, imgfileі у мене була така ж проблема, як і у вас. Ось як я вирішив проблему

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

Вихідний результат

1.0,data/2.jpg

Ви можете змінити цей приклад форматування відповідно до вашої зручності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.