如何防止json.jar中的JSONObject将十进制数字串转换为double

时间:2012-01-03 09:57:28

标签: java json double org.json

使用JSONObject从服务器读取json响应。服务器返回一些十进制数。正常数字不是问题,但是当形式为0.00068的十进制数时会出现问题。像0.00068这样的数字会自动存储到Double对象中,并且在尝试检索此类数字时会返回"计算机化的科学记数法"数字,即6.8E4,即使getDouble(index)方法或getString(index)方法的字符串访问为双倍。

尝试过这种将double值转换为字符串的方法,但已经消除了这个tecinique,因为当Double转换为BigDecimal时会添加一些正整数舍入。这可以通过在缩放到BigDecimal.ROUND_CEILING时舍入集来消除。但是我不想要任何缩放并希望使用原始值,因为实际值是一个小的十进制数,服务器保证数字不会超过小数点后的6位数。

BigDecimal big = new BigDecimal(new Double(0.00680));

System.out.println(big.toPlainString()); //0.006799999999999999621136392846665330580435693264007568359375

System.out.println(big.setScale(15, BigDecimal.ROUND_DOWN)); //0.006799999999999

是否有某种方法可以获得Double的实际字符串值,即没有缩放的数字0.00680,或者我们是否可以阻止JSONObject将数字解释为各自的数字类别。

提前感谢。

3 个答案:

答案 0 :(得分:5)

与您使用的JSON库无关,您不应该使用BigDecimal constructor获取双参数,因为它使用double的二进制浮点值的精确十进制表示

相反,使用静态valueOf方法,因为它使用double的字符串值,因此正确舍入。

  

当必须将double用作BigDecimal的源时,请注意此构造函数提供了精确的转换;它不会产生与使用Double.toString(double)方法将double转换为String然后使用BigDecimal(String)构造函数相同的结果。要获得该结果,请使用静态valueOf(double)方法。

然而,对于非常大或小的数字,解析为double可能已经引入了舍入错误,在这种情况下,唯一的解决方案是使用支持将数字解析为BigDecimals的不同JSON库。

答案 1 :(得分:0)

String str = BigDecimal.valueOf(Obj.getDouble("StringName")).toPlainString();

答案 2 :(得分:0)

在org.json.JSONObject类中,注释掉方法stringToValue(String string)中的行

Extension has been added to Chrome. Use this extension by clicking on this icon...