在前端开发中,我们经常会遇到需要对数字进行保留小数位的场景。比如显示金额时保留两位小数,很多人往往会想起 toFixed 方法,但这样可能导致数据出现不必要的精度问题。
toFixed 方法在处理这种场景时有一些缺陷,它会直接截断数字,四舍五入用的是一种比较玄学的“银行家”算法,这就可能导致精度上的错误,尤其是在处理金额相关的数据时,这种错误会直接影响金额的准确性。
为了解决这个问题,我们可以使用一个改进的 toFixed 函数,它通过先四舍五入在截断,可以很好地保留数字的精度:
function processDot(num, precision) {
return (+(Math.round(+(num + "e" + precision)) + "e" + -precision)).toFixed(
precision,
);
}
num 代表数字,precision 代表小数位。
这个函数的基本思路是:先通过 ES6 的指数运算将数值转为指定精度的科学计数法,再四舍五入,最后再转回指定精度的十进制数字。这样既能保证精度,也能正确实现指定小数位截断的效果。