代码之家  ›  专栏  ›  技术社区  ›  WesleyJohnson

GWT的JSONParser为数字生成不正确的值

  •  2
  • WesleyJohnson  · 技术社区  · 14 年前

    我使用GWT,分析ASP.NET WebService方法返回数据表的JSON结果。我可以将结果解析为jsonValue/jsonObject,这很好。我现在遇到的问题是,我的列是十进制的(20,0),而解析为JSON的值不准确。为了证明W/O对WS调用的需求,在GWT中,我将其结合在一起:

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

    依次提醒:

    {"value":4768428229311982000}
    

    我理解GWT的JSONParser只是使用eval()进行解析,所以这是我从未意识到的javascript中的某种数字/精度问题。我承认我在javascript中使用的数字不多,我可以通过更改.NET WebService将此列作为字符串返回来解决这个问题,但我真的不想这样做。

    谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Pointy    14 年前

    好吧,JavaScript只是使用普通的IEEE754 64位浮点,所以有一个固有的精度限制。该语言不支持任意大小的整数(实际上,也不支持任何纯整数)。当需要在javascript中操作值时,您必须使用字符串表示,并且希望您不必进行任何数学运算。

    编辑: 我以前看过这个: http://www-cs-students.stanford.edu/~tjw/jsbn/

    如果您不需要对数字进行太多的操作,这似乎是一个相当棘手的解决方案,但它可能值得一看。在这个想法上,可能会有一些不那么雄心勃勃的变化。

    在任何情况下,这都不能帮助您直接解释JSON,除非您还连接了一个变体JSON解析器来使用这样的库构造数值。

        2
  •  2
  •   Community leo1    7 年前

    我以前也回答过类似的问题- Arbitrary precision in GWT

    最新的答案是BigDecimal支持正在跟踪GWT 2.1。

    在此之前,如果您不需要使用客户机端的数字进行计算,我建议将它们作为字符串传递。

    另外,查看您的示例,您可以将它们作为字符串传输,并可能使用模拟的gwt java.lang.long。

    最后一道沟,你可以试试svn版本的bigdecimal GWT-Math -将Java文件放入JAR中不应该那么糟糕(它不需要编译,因为它都是EMUL代码)

    如果你走这条路,你仍然需要将数字作为JSON字符串传递,但是你可以执行有意义的数学运算。