一个 double 类型精度问题导致的 Bug

在项目中,遇到一个 Bug —— 显示的订单 ID 不对,和 API 测试平台获取的数据不一致。首先怀疑的是取错字段了,认真检查了一下,不是这个原因。然后怀疑的是 Native 网络请求模块 JsonString 转 Model 的时候出错了,Debug 了一下发现网络请求的结果解析成的 Model 里面的 ID 是对的,也不是这个原因。那问题就一定是出在 ID 从 Native 传递到 JS 环境这个环节(项目用的 Weex)。怀疑是数字太大,超出了 JS 的能表示的最大值。查了 JS 的文档1文档2,原来 JS 把所有的数字都存成 double,double 的格式是这样的:

double类型格式

这样的话,表示整数的话超过2^53 可能会损失精度,(超过2^53 , 就是1 ~ 2^53 乘以 2 、 4、 8 这样表示了,没法精确了),小数的话除非是2^-n 这种,否则无法精确表示(浮点小数精度的问题还付出过生命的代价)。

在 Chrome Console 里面试了一下,果然是这样,(只不过不是超过了能表示的最大值,而是超过了能精确表示的最大值)。

这里写图片描述

这个 Bug 告诉我们,ID 这种最好服务端返回给我 String 类型,用 double 要小心点,整数超过一定范围可能就没法精确了,小数加减乘除可能会有误差(十进制小数与二进制小数相互转换产生的误差),要小心点。

猜你喜欢

转载自blog.csdn.net/fly1183989782/article/details/80300545
今日推荐