gpt4 book ai didi

java - 如何防止 JSONObject 从 json.jar 将十进制数字字符串转换为 double

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:17 25 4
gpt4 key购买 nike

使用 JSONObject 从服务器读取 json 响应。服务器返回一些十进制数。普通数字不是问题,但当存在 0.00068 形式的十进制数时就会出现问题。 0.00068 之类的数字会自动存储到 Double 对象中,当尝试检索此类数字时,会返回该数字的“计算机科学记数法”,即 6.8E4,即使数字通过 getDouble(index) 方法访问为 double,或者通过 getString(index) 方法访问为 String。

尝试过这种将 double 值转换为字符串的方法,但已经取消了这种技术,因为当 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 constructor采用 double 参数,因为它使用 double 二进制浮点值的精确十进制表示

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

When a double must be used as a source for a BigDecimal, note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result, use the static valueOf(double) method.

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

关于java - 如何防止 JSONObject 从 json.jar 将十进制数字字符串转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com