第一行: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 mxT52CRuqR6o5 2022-08-26 16:02:04 +08:00 float? |
![]() | 2 shadow1949 OP @mxT52CRuqR6o5 第一条是按 BigDecimal |
![]() | 3 shadow1949 OP @shadow1949 没打完就发了不好意思。 第一条是按 BigDecimal 转换的,第二条是按 Double 转换的。 |
4 nosoxo 2022-08-26 16:13:51 +08:00 第二个转二进制了 |
![]() | 5 shadow1949 OP @nosoxo 没有理解,转二进制是什么意思呢? |
6 zmal 2022-08-26 16:24:11 +08:00 double 类型的 IEEE 754 标准,十进制可以精确表示的数在二进制下可能无法在有限位数内精确表示。 你在 chrome 控制台打印下 0.1 + 0.2 就知道了。 |
![]() | 7 leeyuzhe 2022-08-26 16:28:39 +08:00 就是 double 的问题 |
![]() | 8 shadow1949 OP @zmal 明白了,谢谢 |
![]() | 9 shadow1949 OP @leeyuzhe 那什么原因导致 fastjson 反序列化没有默认用 BigDecimal ,而是用了 Double 呢? |