最近在工作开发过程中遇到一个奇怪的问题,本来应该四舍五入取整计算的地方偶尔出现四舍五入没生效,直接舍去了最后一位小数的情况。百度后才发现tofixed执行的并不是严格意义上的四舍五入,而是银行家四舍五入
要解决问题也很简单,使用Math.round进行四舍五入就好了。
但是!
在实际代码开发过程中,可能并不是直接一个数字来进行处理,而是需要对某两个或者更多个变量进行计算之后再去四舍五入取值。这是会遇到精度丢失的问题,从而导致Math.round也不能百分百完成我们所需要实现的效果。
所以自己使用tofixed和Math.round结合写了一个js方法,使需要计算时也能很好的达到四舍五入的效果。(当然还会有更好的方法这里只是个人的方法记录一下)
/**
* 四舍五入避免精度丢失和四舍六入的情况出现
* @param decimal 数字
* @param digits 保留几位小数
* @returns
*/
export const formatRound = (decimal = 0, digits = 2) => {
// 如果传进来的不能转为数字,则返回0,同时应该上报异常
if (decimal === undefined || Number.isNaN(decimal)) {
return '0';
}
// 保留几位小数
const powValue = Math.pow(10, digits)
// 四舍五入
const value = (Math.round((Number(decimal) * powValue).toFixed(2)) / powValue).toFixed(2);
return value;
};
以上。