Skip to content

[BUG]科学计数法的浮点数反序列化异常 #3917

@lardern

Description

@lardern

问题描述

科学计算的浮点数反序列化异常

环境信息

请填写以下信息:

  • 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]

重现步骤

如何操作可以重现该问题:

  1. 使用 JSONObject.parse 方法反序列化为JSONObject
  2. 输入 "{\"a\":1.4900000000000002396241300002543983538316751946695148944854736328125e-7}" 数据
  3. 结果错误: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也无效

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions