使用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
将数字解释为各自的数字类别。
提前感谢。
答案 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...