-
Notifications
You must be signed in to change notification settings - Fork 550
Closed
Labels
Milestone
Description
问题描述
科学计算的浮点数反序列化异常
环境信息
请填写以下信息:
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.60]
重现步骤
如何操作可以重现该问题:
- 使用
JSONObject.parse方法反序列化为JSONObject - 输入
"{\"a\":1.4900000000000002396241300002543983538316751946695148944854736328125e-7}"数据 - 结果错误:2.804967296E-65
class A {
private BigDecimal a;
public BigDecimal getA() {
return a;
}
public void setA(BigDecimal a) {
this.a = a;
}
}
public static void main(String[] args) {
String json = "{\"a\":1.4900000000000002396241300002543983538316751946695148944854736328125e-7}";
JSONObject obj = JSONObject.parse(json, JSONReader.Feature.UseBigDecimalForDoubles, JSONReader.Feature.UseBigDecimalForFloats);
System.out.println(obj.get("a"));
System.out.println(obj.get("a").getClass());
A a = JSON.parseObject(json, A.class);
System.out.println(a.a);
System.out.println(new BigDecimal("1.4900000000000002396241300002543983538316751946695148944854736328125e-7"));
}期待的正确结果
期望:obj.get("a") 输出 1.4900000000000002396241300002543983538316751946695148944854736328125E-7
相关日志输出
2.804967296E-65
class java.math.BigDecimal
1.4900000000000002396241300002543983538316751946695148944854736328125E-7
1.4900000000000002396241300002543983538316751946695148944854736328125E-7
Process finished with exit code 0
附加信息
如上输出可知,使用JSON.parseObject指定类型的时候是没问题的,不指定类型解析为JSONObject时结果错误,使用了UseBigDecimalForDoubles也无效
Reactions are currently unavailable