比如计算百分比,乘除法,js计算有小数点,精度会丢失,通过toFixed可以截取小数后几位,但是会四舍五入,而toPrecision则需要指定数字长度。现在要保留小数点后2位,请问怎么处理
let n = 123.123; console.log(n.toPrecision(4)) // 123.1
let n = 123.126; console.log(n.toFixed(2)) // 123.13
期望结果:
let n = 123.1266646635525563;
// 123.12
所谓“没有完美的算法,只有合适的场景”,浮点数字(小数)就是个很好的例子。
我们知道,按照目前的规范,JS 无法直接完美的处理小数。但是实际上,我们往往也不需要它“完美”处理小数。比如,以记账为例,我们通常只关心小数点后两位,也就是“分”,再细的,我们关注它意义不大,投入产出比太低。那么我们就可以把所有数字 * 100,取整后保存,带来的误差非常低。
所以,讨论小数精度问题,要看具体的需求。只要满足需求,怎么保存都可以。
类似的方法,函数其实很多,比如说可以用Math.floor函数,将结果向下取整,最后再除以100。这样可以保留小数点后2位并且不进行四舍五入。
可以这样:
let n = 123.1266646635525563; let result = Math.floor(n * 100) / 100; console.log(result); // 123.12
或者用字符串的substring函数截取小数点后的位数也是可以的,相对刚刚纯数字的方法多了一个转换步骤,相对复杂一点点,但有时候用得上,将len n转换为s字符串,然后在里面找到小数点的位置,最后再输出。
let n = 123.1266646635525563; let result = n.toString(); let decimalIndex = result.indexOf('.') + 1; result = result.substring(0, decimalIndex + 2); console.log(parseFloat(result)); // 123.12