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

    在写 Weex 的时候,遇到一个 Bug —— 显示的订单 ID 不对,和 API 测试平台获取的数据不一致。首先怀疑的是取错字段了,认真检查了一下,不是这个原因。然后怀疑的是 Native 网络请求模块 JsonString 转 Model 的时候出错了,Debug 了一下发现网络请求的结果解析成的 Model 里面的 ID 是对的,也不是这个原因。那问题就一定是出在 ID 从 Native 传递到 JS 环境这个环节。怀疑是数字太大,超出了 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 要小心点,整数超过一定范围可能就没法精确了,小数加减乘除可能会有误差(十进制小数与二进制小数相互转换产生的误差),要小心点。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值