zoukankan      html  css  js  c++  java
  • Chrome/Firefox 中头toFixed方法四舍五入兼容性问题

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

    四舍

    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.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.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.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.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 正确
    

    修复方式

    /*
     * 修复 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的实现没有问题,根本原因是计算机里浮点数精度丢失问题。修复方式改为

    // toFixed 修复
    function toFixed(num, s) {
    	var times = Math.pow(10, s)
    	var des = num * times + 0.5
    	des = parseInt(des, 10) / times
    	return des + ''
    }
    

      

    相关:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

    https://es5.github.io/#x15.7.4.5

  • 相关阅读:
    [机器学习] k-近邻算法(knn)
    [博客] 博客园侧边栏公告设置访问人数及访客国家来源
    Ubuntu搭建hugo博客
    CodeForces
    Javaweb开发入门___1
    JDBC的学习
    Mysql的学习7___权限和数据库设计
    Mysql的学习6____事物,索引,备份,视图,触发器
    Mysql的学习5___Mysql常用函数,聚合函数,sql编程
    Mysql的学习3___数据的管理,主键 外键 以及增改删
  • 原文地址:https://www.cnblogs.com/snandy/p/4886131.html
Copyright © 2011-2022 走看看