2010-03-25 42 views
2

我正在使用GWT并解析返回DataTable的ASP.NET webservice方法的JSON结果。我可以将结果解析为JSONvalue/JSONObject就好了。我遇到的问题是,我的DECIMAL(20,0)中的列以及被解析为JSON的值并不准确。为了证明W/O需要一个WS调用,在GWT我扔了一起:GWT的JSONParser为数字生成不正确的值

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

这反过来提醒:

{"value":4768428229311982000} 

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

感谢您的任何帮助。

+0

我发现这也帮助我了解尖尖的回答是: http://www.phwinfo.com/forum/comp-lang-javascript/405442-problem-large-numbers-javascript.html – WesleyJohnson 2010-03-25 19:01:59

回答

1

那么,Javascript只是使用普通的IEEE 754 64位浮点,所以有一个固有的精度限制。该语言不支持任意大小的整数(或者真的,任何纯粹的整数)。当你需要使用Javascript中的值时,你将不得不使用一个字符串表示,并且希望你不需要做任何数学运算。

编辑:我在此之前看了:http://www-cs-students.stanford.edu/~tjw/jsbn/

这似乎是一个相当毛茸茸的解决方案,如果你不需要做的数字多操纵,但它可能是值得考虑的。那里的想法可能不那么雄心勃勃。

在任何情况下,这不会帮助您直接解释JSON,除非您还使用此库来连接变体JSON解析器来构造数值。

+0

谢谢。我想这是JavaScript的一个限制,但我想不出如何说出它,因为我很少使用数字的准确性至关重要的任何类型的数据。 这些数字只是ID表示数据库表中的唯一行。为什么他们选择将它们存储为如此巨大的小数,我不知道 - 该项目是继承的。 无论如何,你对字符串的建议是可行的,因为我确实不需要和他们做数学计算。谢谢。 :) – WesleyJohnson 2010-03-25 19:01:39

2

也有类似的问题,我较早前回答 - Arbitrary precision in GWT

更是最新的答案是,BigDecimal的支持看起来轨道GWT 2.1

在此之前,如果你不需要做用数字客户端计算,我建议将它们作为字符串传递。

另外,看你的例子,你可以将它们转换为字符串,也许使用模拟的GWT java.lang.Long。

不得已而为之,你可以尝试的BigDecimal GWT-Math的SVN版本 - 它不应该是那么糟糕的Java文件拖放到你的JAR(这将不需要进行编译,因为它是所有EMUL代码)

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