JavaScript toFixed的坑(四舍五入问题)

1,027 阅读1分钟

toFixed的四舍五入规则

toFixed的四舍五入并不是我们所认为的四舍五入,而是银行家舍入法(四舍六入五取偶)

  1. 舍去位 < 5时,直接舍去
  2. 舍去位 >= 6时,舍去且进位
  3. 舍去位 = 5时:
    1. 舍去位后面非空且不为0时,舍去且进位
    2. 舍去位后面空或者全为0时:
      1. 5前面是奇数,舍去且进位
      2. 5前面是偶数,直接舍去

解决方法:Math.round()

Math.round()规则:返回一个数字四舍五入后最接近的整数

例如:保留两位小数,Math.round(number * 100) / 100

Math.round()的坑

稍后你会发现Math.round()的正数和负数如下

console.log(Math.round(1.49));//1
console.log(Math.round(1.5));//2
console.log(Math.round(1.50));//2
console.log(Math.round(1.51));//2
console.log(Math.round(1.55));//2
console.log("==========");
console.log(Math.round(-1.49));//-1
console.log(Math.round(-1.5));//-1
console.log(Math.round(-1.50));//-1
console.log(Math.round(-1.51));//-2
console.log(Math.round(-1.55));//-2

按照以上的结果,负数并不是我们认为的四舍五入(对称的四舍五入) 如果想要(对称的)四舍五入

/**
 * (对称)四舍五入
 * @param  {[type]} number  [待处理数字]
 * @param  {[type]} decimal [需要保留的小数位]
 * @return {[type]}         []
 */
function symmetryRound(number, decimal) {
    var sign = (number < 0) ? -1 : 1;
    var pow = Math.pow(10, decimal);
    number = sign * number;
    return sign * Math.round(number * pow) / pow;
}
console.log(symmetryRound(1.1249,2));//1.12
console.log(symmetryRound(1.125,2));//1.13
console.log(symmetryRound(1.1250,2));//1.13
console.log(symmetryRound(1.1251,2));//1.13
console.log(symmetryRound(1.1255,2));//1.13
console.log(symmetryRound(1.1259,2));//1.13
console.log("===================");
console.log(symmetryRound(-1.1249,2));//-1.12
console.log(symmetryRound(-1.125,2));//-1.13
console.log(symmetryRound(-1.1250,2));//-1.13
console.log(symmetryRound(-1.1251,2));//-1.13
console.log(symmetryRound(-1.1255,2));//-1.13
console.log(symmetryRound(-1.1259,2));//-1.13

最终处理(对称)四舍五入

/**
 * (对称)四舍五入
 * @param  {[type]} number  [待处理数字]
 * @param  {[type]} decimal [需要保留的小数位]
 * @return {[type]}         []
 */
function symmetryRound(number, decimal) {
    var sign = (number < 0) ? -1 : 1;
    var pow = Math.pow(10, decimal);
    number = sign * number;
    return sign * Math.round(number * pow) / pow;
}