Поведение значения с плавающей запятой в Python 2.6 и Python 2.7

#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 является сервером.

  1. fGalleyTopRightOddX т.е. 361.6 вычисляется в среде apache
  2. tLinetextBbox т.е. 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')