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

2022-08-26 15:53:44 +08:00
 shadow1949

第一行: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 呢?百思不得其解……

1764 次点击
所在节点    程序员
9 条回复
mxT52CRuqR6o5
2022-08-26 16:02:04 +08:00
float?
shadow1949
2022-08-26 16:11:38 +08:00
@mxT52CRuqR6o5 第一条是按 BigDecimal
shadow1949
2022-08-26 16:12:21 +08:00
@shadow1949 没打完就发了不好意思。
第一条是按 BigDecimal 转换的,第二条是按 Double 转换的。
nosoxo
2022-08-26 16:13:51 +08:00
第二个转二进制了
shadow1949
2022-08-26 16:20:09 +08:00
@nosoxo 没有理解,转二进制是什么意思呢?
zmal
2022-08-26 16:24:11 +08:00
double 类型的 IEEE 754 标准,十进制可以精确表示的数在二进制下可能无法在有限位数内精确表示。
你在 chrome 控制台打印下 0.1 + 0.2 就知道了。
leeyuzhe
2022-08-26 16:28:39 +08:00
就是 double 的问题
shadow1949
2022-08-26 16:47:23 +08:00
@zmal 明白了,谢谢
shadow1949
2022-08-26 16:47:32 +08:00
@leeyuzhe 那什么原因导致 fastjson 反序列化没有默认用 BigDecimal ,而是用了 Double 呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/875611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX