js toFixed() 四舍五入后并不是你期望的结果

小学的时候学数学就知道有一种叫四舍五入的计算方式,就是对于小数位数的取舍,逢五进一,比如1.225 取两位小数后就是1.23。在前端开发中自己也少不了这样的计算,js也提供了相关的方法--toFixed(n) , 乍一看,还是非常方便的,既然有现成的那就顺序成章,‘肆无忌惮’用了,可是,用着用着就会发现,并没有那方便。因为经常会有你意想不到的问题。比如:1.005.toFixed(2) = 1.00,what? 不应该是1.01吗? 显然,这已经不是五入了,而是五舍了。这可怎么整呢?请看如下代码:

let Num = Number
Num.prototype.toFixed = function (d) {
    let s = this + ''
    if (!d) d = 0
    if (s.indexOf('.') === -1) s += '.'
    s += new Array(d + 1).join('0')
    if (new RegExp('^(-|\\+)?(\\d+(\\.\\d{0,' + (d + 1) + '})?)\\d*$').test(s)) {
      let ss = '0' + RegExp.$2
      let pm = RegExp.$1
      let a = RegExp.$3.length
      let b = true
        if (a === d + 2) {
            a = ss.match(/\d/g)
            if (parseInt(a[a.length - 1]) > 4) {
                for (let i = a.length - 2; i >= 0; i--) {
                    a[i] = parseInt(a[i]) + 1
                    if (a[i] === 10) {
                        a[i] = 0
                        b = i !== 1
                    } else break
                }
            }
            ss = a.join('').replace(new RegExp('(\\d+)(\\d{' + d + '})\\d$'), '$1.$2')
        }
        if (b) ss = ss.substr(1)
        return (pm + ss).replace(/\.$/, '')
    }
    return this + ''
}

  

猜你喜欢

转载自www.cnblogs.com/garfieldzhong/p/11254610.html