侧边栏壁纸
博主头像
@小佑前端_

学而不厌 不耻下问

  • 累计撰写 58 篇文章
  • 累计创建 77 个标签
  • 累计收到 8 条评论

JavaScript精度丢失以及解决方法

@小佑前端_
2022-03-15 / 1 评论 / 1 点赞 / 288 阅读 / 596 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

JavaScript是如何表示数字的?

JavaScript使用Number类型表示数字(整数和浮点数),遵循IEEE 754标准 通过64位来表示一个数字
通过图片具体看一下数字在内存中的表示
image.png
图片文字说明

  • 第0位:符号位,0表示正数,1表示负数(s)
  • 第1位到第11位:储存指数部分(e)
  • 第12位到第63位:储存小数部分(即有效数字)f

js最大安全数是Number.MAX_SAFE_INTEGER == Math.pow(2,53) - 1, 而不是Math.pow(2,52) - 1, why?尾数部分不是只有52位吗?

计算机运算

比如: 0.10.2转换成二进制后会无限循环

0.1 -> 0.0001100110011001...(无限循环)
0.2 -> 0.0011001100110011...(无限循环)

但是由于IEEE 754尾数位数限制,需要将后面多余的位截掉(本文借助这个网站直观展示浮点数在内存中的二进制表示)

image.png
image.png

总结

简单地说,十进制来说1/3这个分数换成小数是0.33333…,然后储存位数是有限的,所以会出现误差,对应到计算机这边来,将数字转成2进制保存的时候,很多数变成无限不循环小数,也就是说,数字在保存的时候存在一部分失真,然后加减之后就可能出现精度问题了

制转换和对阶过程会出现精度损失

解决办法

第三方库

Big.js

BigNumber
官方解释: 一个小型、快速、易于使用的任意精度十进制算术库。

1

评论区