#python #python-2.7 #floating-point #python-2.6
#python #python-2.7 #значение с плавающей запятой #python-2.6
Вопрос:
Я должен преобразовать строку в кортеж с плавающей запятой. В Python 2.7 это дает правильное преобразование, но в Python это не тот же случай.
Я хочу такого же поведения в Python 2.6
Кто-нибудь может мне помочь, почему это не то же самое в Python 2.6 и как это сделать в Python 2.6.
Python 2.6
>>> a
'60.000,494.100,361.600,553.494'
>>> eval(a)
(60.0, 494.10000000000002, 361.60000000000002, 553.49400000000003)
>>> import ast
>>> ast.literal_eval(a)
(60.0, 494.10000000000002, 361.60000000000002, 553.49400000000003)
>>>
>>> for i in a.split(","):
... float(i)
...
60.0
494.10000000000002
361.60000000000002
553.49400000000003
>>>
Python 2.7
>>> a
'60.000,494.100,361.600,553.494'
>>> eval(a)
(60.0, 494.1, 361.6, 553.494)
>>> import ast
>>> ast.literal_eval(a)
(60.0, 494.1, 361.6, 553.494)
>>>
>>> for i in a.split(","):
... float(i)
...
60.0
494.1
361.6
553.494
Это выглядит не очень хорошо
[Правка 2]
Я просто печатаю значение и условие
print fGalleyTopRightOddX, ">=", tLinetextBbox[2], fGalleyTopRightOddX>=tLinetextBbox[2]
361.6 >= 361.6 False
Я вычисляю tLinetextBbox
значение из строки, и какое 361.60000000000002
значение и fGalleyTopRightOddX
значение 361.6
Я работаю над проектом Python Django, где apache является сервером.
fGalleyTopRightOddX
т.е.361.6
вычисляется в среде apachetLinetextBbox
т.е.361.60000000000002
вычисляется с помощью cmd, означает, что я перехожуfGalleyTopRightOddX
к программе, которая запускается командойline os.system
[Редактировать 3] Еще одна информация,
когда я регистрирую дикцию в текстовом файле, я получаю tLinetextBbox
vale как 361.59999999999997
Комментарии:
1. В обоих случаях вы получили правильное значение, просто Python 2.7 улучшил отображение чисел с плавающей запятой . (Укажите ссылку «что каждый специалист по информатике должен знать о числах с плавающей запятой»)
2. @kennytm Может быть, лучше сказать, что в обоих случаях вы получили одно и то же неверное значение.
3. @kennytm и Йохан: спасибо, но я все равно получаю неправильный ответ. Я обновил вопрос, можете ли вы посмотреть еще раз?
Ответ №1:
Чтобы получить тот же результат в Python 2.6, вы должны явно выполнить:
'%.12g' % float_variable
Лучше создать пользовательскую функцию для этого как:
def convert_to_my_float(float_value):
return float('%.12g' % float_value)
Согласно документу десятичных объектов Python:
Изменено в версии 2.6: при создании десятичного экземпляра из строки разрешены начальные и конечные пробельные символы.
Изменено в версии 2.7: аргументу конструктора теперь разрешено быть экземпляром с плавающей запятой.
Ответ на вопрос, почему они ведут себя по-разному?это потому float.__repr__()
, float.__str__()
что методы and в Python 2.7 изменились.
Комментарии:
1. Спасибо, но я все равно получаю неправильный ответ. Я обновил вопрос, можете ли вы посмотреть еще раз?
2. Я думаю, что я все еще не понял вашу проблему. Почему бы не вычислить значение
tLinetextBbox
изos
команды, получить требуемое значение из функции, о которой я упоминал, и передать возвращаемое значение вашей команде ?3. ваша функция не работает,
>>> convert_to_my_float(361.60000000000002) 361.60000000000002 >>> convert_to_my_float(361.6) 361.60000000000002
я добавил некоторую информацию в Edit3, о котором идет речь. Можешь посмотреть?4. Какую ошибку вы получаете? Так ли это
TypeError: float argument required, not str
? Если да, введите его вfloat
значение перед передачей функции как:float('361.60000000000002')