侧边栏壁纸
博主头像
小佑Blog| 小佑前端 | WEB前端博客 | WEB前端笔记 博主等级

未来属于那些相信梦想,并愿意为之付诸行动的人

  • 累计撰写 68 篇文章
  • 累计创建 91 个标签
  • 累计收到 67 条评论

目 录CONTENT

文章目录

JavaScript精度丢失以及解决方法

@小佑前端
2022-03-15 / 1 评论 / 1 点赞 / 2179 阅读 / 0 字 / 正在检测是否收录...

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

评论区