2014-01-06 5 views
1

Проблема в том, что в моем ноутбуке у меня есть python 2.7.5 с некоторой версией Simplejson и на моем сервере Debian 6 у меня есть Python 2.6.6 с некоторой версией simplejson .. , но что происходит на сервер Debian является то, что simplejson добавляет дополнительную точность до значения координат -Python simplejson codes issue

>>> import simplejson as json 
>>> streamer_data = json.loads('{"text": "test","geo": {"type": "Point","coordinates": [52.68908263, -8.50845340]},"coordinates": {"type": "Point","coordinates": [-8.50845340, 52.68908263]}}'); 

>>> print streamer_data 
{u'text': test', u'geo': {u'type': u'Point', u'coordinates': [52.689082630000001, -8.5084534000000005]}, u'id': 420024061457346560L, u'coordinates': {u'type': u'Point', u'coordinates': [-8.5084534000000005, 52.689082630000001]}} 

на моем ноутбуке это дает правильный результат с надлежащей точностью координат значения -

>>> print streamer_data 
{'text': 'test', 'geo': {'type': 'Point', 'coordinates': [52.68908263, -8.5084534]}, 'coordinates': {'type': 'Point', 'coordinates': [-8.5084534, 52.68908263]}} 

является ли это Simplejson версий проблема метиз другой. Также обратите внимание, что я попытался выяснить версию simplejson на сервере debian, но не успел.

+1

Хм не уверен в этом. Это может быть полезно, но это не просто: http://stackoverflow.com/questions/1447287/format-floats-with-standard-json-module – valheru

+0

У вашего вопроса нет вопросов. –

ответ

4

Это различие между Python 2.6 и 2.7 не имеет ничего общего с simplejson. В 2.7 есть changes to the algorithms used to produce the string representation and rounding of floating point numbers.

$ python2.6 -c "print([52.68908263, -8.50845340])" 
[52.689082630000001, -8.5084534000000005] 
$ python2.7 -c "print([52.68908263, -8.50845340])" 
[52.68908263, -8.5084534] 
+0

Perfect ..thanks .. это работает для меня .. сложной частью было установить Python 2.7 на Debian 6, но эта проблема была решена http://www.yodi.sg/install-python-2-7-debian- 6-0-squeeze/ – UberNeo

+0

BTW любой обходной путь, чтобы сделать эту работу в Python 2.6, попытался использовать этот http://stackoverflow.com/a/1447562/2374316 .. но это также, похоже, не работает на 2.6 – UberNeo

+0

Вы действительно нужно изменить это? Как отмечает Роберт Симер в своем ответе, это действительно просто визуальная разница. Бинарные значения представлений 2.6 или 2.7 должны быть одинаковыми. В противном случае, вероятно, было бы проще перейти на Python 2.7. –

0

@ ответ Неда правильно, но я хотел бы добавить:

Ваш вопрос только визуальный один, оба представления точно так же на «нормальный» компьютер. И также не совсем то, что компьютер (может) магазин:

>>> a = 52.68908263 
>>> b = 52.689082630000001 
>>> '{0:.30} = {1:.30}: {2}'.format(a, b, a==b) 
Python 2.6: 
'52.6890826300000014725810615346 = 52.6890826300000014725810615346: True' 
Python 2.7: 
'52.6890826300000014725810615346 = 52.6890826300000014725810615346: True' 

Как видно сейчас: никакой разницы между этими числами. Python2.7 печатает более короткое представление чисел, когда он может удостовериться, что они вернутся к одному и тому же внутреннему значению. Python2.7 может делать это только на некоторых системах (с некоторыми компиляторами) (отметьте sys.float_repr_style, это «короткий» или «устаревший»).

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