持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
众所周知,JavaScript 在某些浮点数的运算时会出现精度丢失的问题,比如在控制台中输入 0.1+0.2,得到的是 0.30000000000000004,而不是精确的 0.3,这是什么原因呢?
在计算机基础中我们应该学过,计算机中所有的数据最终都是以二进制的形式存储的,当然数字的存储也不例外。
当计算 0.1+0.2 的时候,实际上计算的是这两个数字在计算机里所存储的二进制,0.1 和 0.2 在转换为二进制表示的时候会出现位数无限循环的情况。当然计算机不会用无限的空间去存储这些无限循环的二进制数字,那对于这类数据该怎么处理呢?
JavaScript 中数字的存储
JavaScript 中数字的存储遵循 IEEE 754 标准,是以 64 位双精度格式来存储数字的
我们只需要知道,在二进制科学表示法中,双精度浮点的小数部分最多只能保留 52 位(比如 1.xxx... * 2^n,小数点后的 x 最多保留 52 位),加上前面的1,其实就是保留 53 位有效数字,超过这个长度的位数会被舍去(会采用 0舍1入 的方式),这样就造成了精度丢失的问题。
因为在 0.1 + 0.2 进行计算的时候,实际上计算的是这两个数字在计算机里所存储的二进制
0.1 和 0.2 在进行二进制转换的时候会出现无限循环的情况.
解决方案一:可以将其转换为整数后在进行运算,运算后再转为对应的小数
解决方案二:可以利用中的极小数Number.EPSILON来进行判断
判断 0.1 + 0.2 是否等于 0.3,可以将两个数字相加的结果与 0.3 相减,如果想着的结果小于极小 数,那么就可以认定是相等的: