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)
    }
}

相关:

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

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

时间: 2024-10-03 13:45:58

Chrome/Firefox 中头toFixed方法兼容性问题的相关文章

js中Number.toFixed()方法的理解

需求:对浮点数进行四舍五入精度获取. 问题:直接使用Number.toFixed()会出现异常的舍入情况. 原因:计算机浮点数存储是二进制,js的Number.toFixed()实际的精度确认规则是四舍六入五成双,逢四下舍,逢六入一,逢五时,根据浏览器内核计算结果也不尽相同. 具体原理这里不做详细描述,各位看官可自行查阅相关资料. 解决方法:重新Number.toFixed()方法. 实现原理:将浮点数转化为整数,保留所需位数,再转为浮点数. 实现代码: 1 Number.prototype.t

配置在Chrome,Firefox中打开

安装 SideBarEnhancements 然后通过ctrl + k, ctrl + b打开侧边栏,在侧边栏的文件中右击,找到 open width -> edit applications 然后在这里边设置firefox打开的方式. application : 路径要修改为自己默认安装的路径. [    {"id": "side-bar-files-open-with",        "children":        [     

如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

这篇博文主要针对浏览器中绘制椭圆的方法扩展.在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷.其中有压缩法,计算法,贝塞尔曲线法等多种方式.但是都不能很好的绘制出椭圆.所有我就对这个绘制椭圆的方式进行了研究,发现压缩法是可以完美实现椭圆绘制的.废话不多说,直接上代码了. 1 if (!CanvasRenderingContext2D.prototype.ellipse) { 2 CanvasRenderingContext2D.prototype.ellipse = function(x, y,

jQuery中animate()的方法以及$("body").animate({"scrollTop":top})不被Firefox支持问题的解决

jQuery中animate()的方法可以去w3school查看,这里主要说一下: $("body").animate({"scrollTop":top}) 不被Firefox支持问题的解决. 其实是使用body的: $("body").animate({"scrollTop":top}) 只被chrome支持,而不被Firefox支持. 而使用html的: $("html").animate({"

Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应

在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: 1 function Sure(obj) { 2 var statu = confirm("是否确认删除?"); 3 if (!statu) { 4 return false; 5 } 6 var objOrderID = obj.id; 7 $.ajax( 8 { 9 type: "Post", 10 url: "/A

解决chrome和firefox中文件上传本地路径隐藏的问题

如果想上传一张图片,在页面中实现预览,可以获取文件的上传路径,然后在一个<img/>里面显示,文件的上传路径就是<input type="file"/>的value.在IE下是value是等于本地路径的,然而,在chrome和firefox中,出于安全考虑,路径却是匿名,比如,上传E盘中的readme.txt,得到的value却是C:/fakepath/readme.txt. 要在页面显示上传的图片,可以先上传到服务器,然后再下载下来回避这个问题,但这样会有多余

关于CSS中隐藏内容方法的思考

正在读<精通CSS>,很多样式需要用到内容隐藏,比如平时无内容,鼠标悬停时显示出内容.书中常用的方法是用text-indent:-1000em.margin-left:-1000em将元素隐藏到屏幕边缘之外,而display:none和visibility:hidden.overflow:hidden也可以做到隐藏,那么这几种用法有哪些利弊呢? 1.display:none; 搜索引擎可能认为被隐藏的元素属于垃圾信息而忽略,不利于SEO:屏幕阅读器会忽略被隐藏的元素. 2.visibility

toFixed方法的bug

最近在工作过程中碰到一个隐藏的bug,经调试发现竟然是toFixed函数不可靠的结果引起的.后端同学在处理价格比较的时候,用foFixed进行价格的四舍五入之后,竟然发现比较的结果有问题: 大家都知道,Number类型的变量有个toFixed方法,该方法将Number四舍五入为指定小数位数的数字,以字符串返回. IE: 0.6 .toFixed(0); // 0 1.6 .toFixed(0); // 2 Chrome: 0.6 .toFixed(0); // 1 1.6 .toFixed(0)

【js】IE、FF、Chrome浏览器中的JS差异介绍

如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject  ff 的getBoxObjectFor  opera 的window.opera  safari 的openDatabase  Chrome 的MessageEvent有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧 2