V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shadow1949
V2EX  ›  程序员

利用 fastjson 序列化时,几乎相同的代码结果不一样……会是什么原因呢?

  •  
  •   shadow1949 · 2022-08-26 15:53:44 +08:00 · 1706 次点击
    这是一个创建于 609 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一行:dtov2.setFormData(JsonUtils.getObjectFromString(object.getFormData(), Maps.newHashMap().getClass()));

    第二行:Map<String, Object> objectFromString = JsonUtils.getObjectFromString(object.getCompletedForm(), Maps.newHashMap().getClass());

    背景:formData 和 completedForm 都是利用 fastjson 的 parseObject 方法,String 转 Map<String, Object>,并且他们都有一个 key 叫做 price 。

    问题:什么原因会导致 value=3.8 时,第一个 value 是 3.8 ,第二个是 3.799999952316284 呢?百思不得其解……

    第 1 条附言  ·  2022-08-27 07:24:56 +08:00
    已破案,第二行是因为被后续代码中的相同 key ,value 是 double 类型的值覆盖了。本身 fastjson 没有任何问题。
    排查不仔细,定位错误的思路有问题,浪费大家和自己的时间了。T.T
    mxT52CRuqR6o5
        1
    mxT52CRuqR6o5  
       2022-08-26 16:02:04 +08:00
    float?
    shadow1949
        2
    shadow1949  
    OP
       2022-08-26 16:11:38 +08:00
    @mxT52CRuqR6o5 第一条是按 BigDecimal
    shadow1949
        3
    shadow1949  
    OP
       2022-08-26 16:12:21 +08:00
    @shadow1949 没打完就发了不好意思。
    第一条是按 BigDecimal 转换的,第二条是按 Double 转换的。
    nosoxo
        4
    nosoxo  
       2022-08-26 16:13:51 +08:00
    第二个转二进制了
    shadow1949
        5
    shadow1949  
    OP
       2022-08-26 16:20:09 +08:00
    @nosoxo 没有理解,转二进制是什么意思呢?
    zmal
        6
    zmal  
       2022-08-26 16:24:11 +08:00
    double 类型的 IEEE 754 标准,十进制可以精确表示的数在二进制下可能无法在有限位数内精确表示。
    你在 chrome 控制台打印下 0.1 + 0.2 就知道了。
    leeyuzhe
        7
    leeyuzhe  
       2022-08-26 16:28:39 +08:00
    就是 double 的问题
    shadow1949
        8
    shadow1949  
    OP
       2022-08-26 16:47:23 +08:00
    @zmal 明白了,谢谢
    shadow1949
        9
    shadow1949  
    OP
       2022-08-26 16:47:32 +08:00
    @leeyuzhe 那什么原因导致 fastjson 反序列化没有默认用 BigDecimal ,而是用了 Double 呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2828 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:45 · PVG 19:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.