Chrome/Firefox 中头toFixed方法四舍五入兼容性问题

每个Number的toFixed()方法可把 Number 四舍五入为指定小数位数的数字。四舍五入顾名思义,4及以下舍去,5及以上加1。

四舍

1
2
3
4
1.31.toFixed(1) // 1.3
1.32.toFixed(1) // 1.3
1.33.toFixed(1) // 1.3
1.34.toFixed(1) // 1.3

 

五入

1
2
3
4
5
1.35.toFixed(1) // 1.4
1.36.toFixed(1) // 1.4
1.37.toFixed(1) // 1.4
1.38.toFixed(1) // 1.4
1.39.toFixed(1) // 1.4

 

IE6-10

1
2
3
4
5
6
1.35.toFixed(1) // 1.4 正确
1.335.toFixed(2) // 1.34  正确
1.3335.toFixed(3) // 1.334 正确
1.33335.toFixed(4) // 1.3334 正确
1.333335.toFixed(5)  // 1.33334 正确
1.3333335.toFixed(6) // 1.333334 正确

 

但在 chrome44/firefox41 里对于最后一位是 5 的有时竟然没有进位

1
2
3
4
5
6
1.35.toFixed(1) // 1.4 正确
1.335.toFixed(2) // 1.33  错误
1.3335.toFixed(3) // 1.333 错误
1.33335.toFixed(4) // 1.3334 正确
1.333335.toFixed(5)  // 1.33333 错误
1.3333335.toFixed(6) // 1.333333 错误

可以看到,小数点位数为2,5时四舍五入是正确的,其它是错误的。

 

如果最后一位为非 5 ,chrome44/firefox41 则没有这个问题

1
2
3
4
5
6
1.36.toFixed(1) // 1.4 正确
1.336.toFixed(2) // 1.34  正确
1.3336.toFixed(3) // 1.334 正确
1.33336.toFixed(4) // 1.3334 正确
1.333336.toFixed(5)  // 1.33334 正确
1.3333336.toFixed(6) // 1.333334 正确

 

修复方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
 * 修复 firefox/chrome 中 toFixed 兼容性问题
 * firefox/chrome 中,对于小数最后一位为 5 时进位不正确,修复方式即判断最后一位为 5 的,改成 6, 再调用 toFixed
 */
function toFixed(number, precision) {
    var str = number + ''
    var len = str.length
    var last = str.substr(len-1, len)
    if (last == '5') {
        last = '6'
        str = str.substr(0, len-1) + last
        return (str - 0).toFixed(precision)       
    else {
        return number.toFixed(precision)
    }
}

 

2015.10.26 补充:Firefox 和 Chrome的实现没有问题,根本原因是计算机里浮点数精度丢失问题。修复方式改为

1
2
3
4
5
6
7
// toFixed 修复
function toFixed(num, s) {
    var times = Math.pow(10, s)
    var des = num * times + 0.5
    des = parseInt(des, 10) / times
    return des + ''
}

四舍

1
2
3
4
1.31.toFixed(1) // 1.3
1.32.toFixed(1) // 1.3
1.33.toFixed(1) // 1.3
1.34.toFixed(1) // 1.3

 

五入

1
2
3
4
5
1.35.toFixed(1) // 1.4
1.36.toFixed(1) // 1.4
1.37.toFixed(1) // 1.4
1.38.toFixed(1) // 1.4
1.39.toFixed(1) // 1.4

 

IE6-10

1
2
3
4
5
6
1.35.toFixed(1) // 1.4 正确
1.335.toFixed(2) // 1.34  正确
1.3335.toFixed(3) // 1.334 正确
1.33335.toFixed(4) // 1.3334 正确
1.333335.toFixed(5)  // 1.33334 正确
1.3333335.toFixed(6) // 1.333334 正确

 

但在 chrome44/firefox41 里对于最后一位是 5 的有时竟然没有进位

1
2
3
4
5
6
1.35.toFixed(1) // 1.4 正确
1.335.toFixed(2) // 1.33  错误
1.3335.toFixed(3) // 1.333 错误
1.33335.toFixed(4) // 1.3334 正确
1.333335.toFixed(5)  // 1.33333 错误
1.3333335.toFixed(6) // 1.333333 错误

可以看到,小数点位数为2,5时四舍五入是正确的,其它是错误的。

 

如果最后一位为非 5 ,chrome44/firefox41 则没有这个问题

1
2
3
4
5
6
1.36.toFixed(1) // 1.4 正确
1.336.toFixed(2) // 1.34  正确
1.3336.toFixed(3) // 1.334 正确
1.33336.toFixed(4) // 1.3334 正确
1.333336.toFixed(5)  // 1.33334 正确
1.3333336.toFixed(6) // 1.333334 正确

 

修复方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
 * 修复 firefox/chrome 中 toFixed 兼容性问题
 * firefox/chrome 中,对于小数最后一位为 5 时进位不正确,修复方式即判断最后一位为 5 的,改成 6, 再调用 toFixed
 */
function toFixed(number, precision) {
    var str = number + ''
    var len = str.length
    var last = str.substr(len-1, len)
    if (last == '5') {
        last = '6'
        str = str.substr(0, len-1) + last
        return (str - 0).toFixed(precision)       
    else {
        return number.toFixed(precision)
    }
}

 

2015.10.26 补充:Firefox 和 Chrome的实现没有问题,根本原因是计算机里浮点数精度丢失问题。修复方式改为

1
2
3
4
5
6
7
// toFixed 修复
function toFixed(num, s) {
    var times = Math.pow(10, s)
    var des = num * times + 0.5
    des = parseInt(des, 10) / times
    return des + ''
}
posted @ 2023-06-09 17:17  LALAYU  阅读(126)  评论(0编辑  收藏  举报