javascript、typescript 保留两位或n位小数包括四舍五入 和 不四舍五入进位四舍五入1. toFixed(n)一般保留小数基本会先想到用toFixed(x)x区间[0,20]但会四舍五入返回的是字符串letnum3.141592653;letnnum.toFixed(3);// 3.1422. toPrecision(n)toPrecision(x)x区间[0,21]和上面的方法一样但是会包括整数位所以区间1letnum3.141592653;letnnum.toPrecision(4);// 3.1423. Math.round直接取整配合乘除保留任意位。letnum3.141592653;letnMath.round(num*1000)/1000;// 3.142逼逼这么多你是不是想找不进位的方法它来了4. 作为额外思路你当个玩具多取一位然后再截取就完事如果一直进位那你就自行扩展到要截的那位即可letnum3.141592653;letnnum.toFixed(3).slice(0,-1);// 3.14// 评论区已经举了反例1.999.toFixed(3) → 2.000 → slice(0,-1) → 2.00错误应该是 1.99//之前没写完就没登上来看没及时看到反馈找借口我的问题//你可以先转string然后再截但应该也有点问题不纠结用下面的5. Math.floorletnum3.141592653;letlen2;letpMath.pow(10,len);// num3.141592653取2位 3.14// num3.9999取2位 3.99letnMath.floor(num*p1e-12)/p;// 1e-12 防浮点误差银行家算法精度问题为什么是这个值可以拉到最后直接复制去用/** 保留 len 位小数roundtrue 四舍五入false 截断 */publicfixedNum(num:number,len:number,round:booleantrue):number{letpMath.pow(10,len);letvnum*p1e-12;return(round?Math.round(v):Math.floor(v))/p;}1e-12 是怎么来的摘抄JS 浮点是 IEEE 754 双精度53 位尾数 ≈ 15~17 位十进制有效位。num * p的误差量级 ≈|num * p| × Number.EPSILONEPSILON ≈ 2.22e-16。例3.14 * 100 313.99999999999994 误差 ≈ 314 × 2.22e-16 ≈ 7e-14 1e-12 ≈ 0.000000000001 7e-14 ≈ 0.00000000000007 //比补偿值小两个量级 1e-12 7e-14 //够盖住误差选值区间上限1 / 10^digits超过会改变计算结果下限|num * p| × Number.EPSILON小于这个补不动1e-12 是通用值想精可以用|num * p| * Number.EPSILON * 10