JavaScript是如何表示数字的?
JavaScript
使用Number类型表示数字(整数和浮点数),遵循IEEE 754
标准 通过64
位来表示一个数字
通过图片具体看一下数字在内存中的表示
图片文字说明
- 第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.1
和0.2
转换成二进制后会无限循环
0.1 -> 0.0001100110011001...(无限循环)
0.2 -> 0.0011001100110011...(无限循环)
但是由于IEEE 754尾数位数限制,需要将后面多余的位截掉(本文借助这个网站直观展示浮点数在内存中的二进制表示)
总结
简单地说,十进制来说1/3
这个分数换成小数是0.33333…
,然后储存位数是有限的,所以会出现误差,对应到计算机这边来,将数字转成2进制保存的时候,很多数变成无限不循环小数,也就是说,数字在保存的时候存在一部分失真,然后加减之后就可能出现精度问题了
制转换和对阶过程会出现精度损失
解决办法
第三方库
Big.js
BigNumber
官方解释: 一个小型、快速、易于使用的任意精度十进制算术库。
评论区