JS中,所有数字都以双精度64位浮点格式表示,因此部分小数进行计算时,会出现无法预测的长小数结果,导致无法得到想要的结果。
为了避免这种现象出现,可以使用个简单方法转换后再进行计算,即将数字放大为整数后计算再等比缩小
那关键就在于获取小数精度位,以下是方法代码:
function getPrecision(num) {let str = num.toString()return Math.pow(10, str.split('.')[1].length) }
先将数字转换为字符串,然后再转换为数组,因为有小数,所以数组第二项必定为小数部分;
然后获取这串“字符串”的长度,再应用Math.pow(x, y)函数(计算x的y次方)获取需要缩放的倍数,就可以了。
注意:若是一元运算,请对每一个参数调用并算出最大值,使用最大倍数进行计算;
若是小数部分精度过高,转换后的整数值过大,那么需要转换为BigInt类型,再数字末尾加上n或者使用BigInt构造即可。
不过因为BigInt只有整型,而过高精度的小数也无法正确保留其数值,所以如果位数实在太高的话那就没办法了(交给后端吧!)