Using JSONObject
从服务器读取 json 响应。服务器返回一些十进制数。正常数字不是问题,但当存在小数形式时就会出现问题0.00068
。像这样的数字0.00068
会自动存储到Double
对象,并且当尝试检索此类数字时,会返回该数字的“计算机科学记数法”,即 6.8E4,即使该数字作为 double 访问getDouble(index)
方法或作为字符串getString(index)
method.
已经尝试过这种将双精度值转换为字符串的方法,但已经消除了这种技术,因为在以下情况下添加了一些正舍入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
将数字解释为各自的数字类别。
提前致谢。
与您使用的 JSON 库无关,您不应该使用BigDecimal 构造函数 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal%28double%29采用 double 参数,因为它使用 double 的二进制浮点值的精确十进制表示形式
相反,使用静态valueOf
方法,因为它使用 double 的字符串值,因此可以正确舍入。
当必须使用 double 作为 BigDecimal 的源时,请注意此构造函数提供了精确的转换;它不会给出与使用将双精度数转换为字符串相同的结果Double.toString(double)
方法,然后使用BigDecimal(String)
构造函数。要获得该结果,请使用静态valueOf(double)
方法。
但是,对于非常大或很小的数字,解析为双精度可能已经引入了舍入错误,在这种情况下,唯一的解决方案是使用支持将数字解析为 BigDecimal 的不同 JSON 库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)