JSONParser GWT производит неправильные значения для чисел - PullRequest
2 голосов
/ 25 марта 2010

Я работаю с GWT и анализирую результат JSON из метода веб-сервиса ASP.NET, который возвращает DataTable. Я могу просто разобрать результат в JSONvalue / JSONObject. У меня проблема в том, что один из моих столбцов в DECIMAL (20, 0) и значения, которые анализируются в JSON, не являются точными. Чтобы продемонстрировать без необходимости вызова WS, в GWT я бросил это вместе:

String jsonString = "{value:4768428229311981600}";
JSONObject jsonObject = JSONParser.parse( jsonString ).isObject();
Window.alert( jsonObject.toString() );

Это в свою очередь предупреждает:

{"value":4768428229311982000}

Я понимаю, что JSONParser из GWT просто использует eval () для анализа, так что это какая-то проблема с точностью / числом в JavaScript, о которой я никогда не знал. Я признаю, что не слишком много работаю с числами в JavaScript, и я мог бы обойти это, изменив .NET WebService, чтобы он возвращал этот столбец как строку, но я бы действительно не хотел этого делать.

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 26 марта 2010

Был похожий вопрос, на который я недавно ответил - Произвольная точность в GWT

Более актуальный ответ заключается в том, что поддержка BigDecimal на пути к GWT 2.1

До тех пор, если вам не нужно производить вычисления с использованием чисел на стороне клиента, я рекомендую передавать их в виде строк.

Кроме того, глядя на ваш пример, вы можете передать их в виде строк и, возможно, использовать эмулированный GWT java.lang.Long.

В последний раз, вы можете попробовать svn-версию BigDecimal GWT-Math - не так уж и плохо бросать java-файлы в вашу флягу это все код эмульсии)

Если вы пойдете по этому пути, вам все равно придется передавать числа в виде строк JSON, но вы можете выполнять значимую математику.

1 голос
/ 25 марта 2010

Ну, Javascript просто использует 64-битную стандартную IEEE 754 с плавающей запятой, так что есть предел точности. Язык не обеспечивает поддержку целых чисел произвольного размера (или вообще никакого чистого целого числа). Вам нужно будет использовать строковое представление, когда вам нужно манипулировать значениями в Javascript, и, надеюсь, вам не придется выполнять какие-либо математические операции.

edit: Я смотрел раньше на это: http://www -cs-students.stanford.edu / ~ tjw / jsbn /

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

В любом случае, это не поможет вам с прямой интерпретацией JSON, если вы не подключите вариантный анализатор JSON для построения числовых значений с использованием такой библиотеки.

...