上海建筑网站大全,自己做的网站用在博客上,石家庄职业技术学院,怎样做网站公司的销售最近发现JS当中toFixed()方法存在一些问题#xff0c;采用原生的Number对象的原型对象上的toFixed()方法时#xff0c;规则并不是所谓的“四舍五入”或者是“四舍六入五成双”#xff0c;以谷歌浏览器为例:
alert(1.5451.toFixed(2));//输出 1.55 alert(1.545.toFixed(2));…最近发现JS当中toFixed()方法存在一些问题采用原生的Number对象的原型对象上的toFixed()方法时规则并不是所谓的“四舍五入”或者是“四舍六入五成双”以谷歌浏览器为例:
alert(1.5451.toFixed(2));//输出 1.55 alert(1.545.toFixed(2)); //输出 1.54 alert(1.5551.toFixed(2)); //输出 1.56 alert(1.555.toFixed(2)); //输出 1.55 即小数点后第三位5后面有数时进位后面没数时舍弃不进位 注 “四舍六入五成双”也即“4舍6入5凑偶”这里“四”是指≤4 时舍去六是指≥6时进上五指的是根据5后面的数字来定当5后有数时舍5入1当5后无有效数字时需要分两种情况来讲①5前为奇数舍5入1②5前为偶数舍5不进。0是最小的偶数 。百度百科上涉及的几个例子在实际情况下确实成立但不科学并不能覆盖所有的情况。
在浮点数末尾≤4或者≥6的情况下的舍入没有争议但当末尾正好等于5的情况下可谓混乱之极与浏览器有关同样的方法在谷歌和IE上会有不同显示。 总结众所周知遵循IEEE754数值格式的语言的浮点计算会出现精度损耗的通病ES也并非独此一家因此尽量不要进行某个特定浮点数值的测试如0.10.2 解决方案重写Number.prototype.toFixed()方法:
Number.prototype.toFixedfunction (d) { var sthis; if(!d)d0; if(s.indexOf(.)-1)s.; snew Array(d1).join(0); if(new RegExp(^(-|\\)?(\\d(\\.\\d{0,(d1)})?)\\d*$).test(s)){ var s0RegExp.$2,pmRegExp.$1,aRegExp.$3.length,btrue; if(ad2){ as.match(/\d/g); if(parseInt(a[a.length-1])4){ for(var ia.length-2;i0;i--){ a[i]parseInt(a[i])1; if(a[i]10){ a[i]0; bi!1; }else break; } } sa.join().replace(new RegExp((\\d)(\\d{d})\\d$),$1.$2); }if(b)ss.substr(1); return (pms).replace(/\.$/,); }return this;