前言
在大家工作的过程当中如果遇到数字运算相关的内容,往往会出现一些莫名其妙的问题。本篇文章将我自己遇到的数字运算及处理过程中的一些的问题简单描述下
小数
问题
我们在浏览器控制台输入0.1 + 0.2期望得到的结果是0.3,然而事实并不是这样:
产生这种情况主要因为代码在处理小数的时候会将其转换为二进制的形式,由于转换规则的限制很多小数转换为为二进制时是一个无线循环的二进制数。
对于小数来说,转换为二进制是乘 2 取整操作。比如0.1转换成为二进制: 0.1=0.0001100110011001100110011001100....(以1100循环)
而这些二进制的小数在计算机中存储的位数有限,所以在存储和计算的过程中并没有将真正准确的浮点型数字进行处理,自然会造成运算结果的偏差
解决
- 其中最先想到的方式是通过将待处理的数字乘以1000...来转换成整数,计算完毕后在除回来
- 引用现成类库:mah.js、decimal.js等
大数
除了大数的运算之外,我们在js中获取一些大数,经常会遇到如下情况:
这种数字在展示的时候并不是我们想要的结果,其主要原因还是这些数字在转换为二进制后存储到内存中的位数是有限的。
解决
- 转换为字符串
- 使用bigInt