Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
我们在开发中经常会遇到小数计算的业务,但经常会发现精度丢失问题,如0.1+0.2并!=0.3,还有很多问题,如果你在页面做一些计算显示,那么很可能数字就就会冲破页面,既不精确又不美观。你知道这个js种精度丢失是怎么造成的呢,那么我们是怎么来解决呢?尝试解决0.1+0.2!=0.3与0.2+0.7!=0.9的问题。
考察点
- 老生常谈的js精度丢失问题,主要考察对js中Number类型的理解。
解题思路
- JS中所有的数字(包括小数、整型)都是浮点型的Number类型。
- Number类型使用binary64或双精度表示的,实质是一个二进制格式64位的浮点数。
- 小数进行算术运算时,实质上就是把十进制的浮点数转化为二进制,这样的结果是无穷的,JS最多有2的53次方有效数字,所以这样并不是精准的,如果再进行运算时会失准。
- 可以将计算的的小数同时扩大10的N方倍,使其变成整数,再进行加法计算,最后再除以10的N方倍就不会失准。
实现
const roundNum = (num, decimal = 3) => Math.round(num * 10 ** decimal) / 10 ** decimal;
这里就是通过扩大十的倍数的方案,缩进小数,仅仅是用了一行就可以解决这个问题。
roundNum(0.1 + 0.2) // 0.3
roundNum(0.2 + 0.7) // 0.9
当然也仅仅是暂时的解决,并不完美。我们还是需要在一些精确度比较高的数值上,还需要手动传入,当然你可以进一步改造成字符串,算出最大位数来完成。实际开发中我们也可以引入类似于big.js来完成我们的需求。