2016-10-06 3 views
4

Мне нужно преобразовать строку в кортеж float. В Python 2.7 он дает правильное преобразование, но в Python это не тот случай.Поведение значения Float в Python 2.6 и Python 2.7

Я хочу такое же поведение в 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 

Это не хорошо выглядеть

[Edit 2]

Я только значение печати и состояние

print fGalleyTopRightOddX, ">=", tLinetextBbox[2], fGalleyTopRightOddX>=tLinetextBbox[2] 

361.6 >= 361.6 False 

рассчитать tLinetextBbox значения из строки и которая 361.60000000000002 и fGalleyTopRightOddX значения 361.6

Я работаю на Python Django проекта, где апач является сервер ,

  1. fGalleyTopRightOddX т.е. 361.6 рассчитывается в апача среде
  2. tLinetextBbox т.е. 361.60000000000002 рассчитывается на ЦМД означает, что я передать fGalleyTopRightOddX к программе, которая запускается командой line os.system

[Редактировать 3] Только один дополнительная информация,

когда я регистрирую дикцию i п текстовый файл, то я получаю tLinetextBbox юдоль как 361.59999999999997

+8

В обоих случаях у вас есть правильное значение, это просто Python 2.7 [улучшено отображение чисел с плавающей запятой] (https://docs.python.org/3/whatsnew/2.7.html#other-language-changes). (Cue «то, что каждый компьютерный ученый должен знать о номере с плавающей точкой») – kennytm

+2

@kennytm Возможно, лучше сказать, что в обоих случаях у вас есть то же * неправильное значение *. –

+0

@kennytm и Johan: спасибо, но я все еще ошибаюсь. Я обновил вопрос, можно снова посмотреть? –

ответ

4

Для того, чтобы получить тот же результат в Python 2.6, вы должны явно сделать:

'%.12g' % float_variable 

Лучше создать пользовательскую функцию, чтобы сделать это как:

def convert_to_my_float(float_value): 
    return float('%.12g' % float_value) 

в соответствии с Python's Decimal Objects Документ:

Changed in version 2.6: leading and trailing whitespace characters are permitted when creating a Decimal instance from a string.

Changed in version 2.7: The argument to the constructor is now permitted to be a float instance.

Ответ на вопрос Почему они ведут себя по-другому? есть, потому что float.__repr__() и float.__str__() методы в Python 2.7 изменены.

+0

Thanx, но я все равно ошибаюсь. Я обновил вопрос, можно снова посмотреть? –

+0

Думаю, у меня все еще не было проблемы. Почему бы не вычислить значение 'tLinetextBbox' из команды' os', получить требуемое значение из упомянутой функции и передать возвращаемое значение * вашей команде *? –

+0

ваша функция не работает, '>>> convert_to_my_float (+361,60000000000002) +361,60000000000002 >>> convert_to_my_float (361,6) +361,60000000000002 ' Я добавил некоторую информацию, чтобы EDIT3 в вопросе. Можете ли вы посмотреть? –

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