最近發現JS當中toFixed()方法存在一些問題,采用原生的Number對象的原型對象上的toFixed()方法時,規則並不是所謂的“四捨五入”或者是“四捨六入五成雙”,所謂“四捨六入五成雙”,在百度百科上給的解釋是:也即“4捨6入5湊偶”這裡“四”是指≤4 時捨去,"六"是指≥6時進上,"五"指的是根據5後面的數字來定,當5後有數時,捨5入1;當5後無有效數字時,需要分兩種情況來講:①5前為奇數,捨5入1;②5前為偶數,捨5不進。(0是最小的偶數) 。百度百科上涉及的幾個例子在實際情況下確實成立,但不科學,並不能覆蓋所有的情況。
測試浏覽器:屌絲浏覽器IE6以及高級屌絲浏覽器IE78和所有現代主流浏覽器包括IE9、IE10、FF、chrome、opera、safari。(注:在使用IE10的類似firebug的開發工具時,采用兼容IE低版本浏覽器模式時的測試結果跟使用原生低版本IE浏覽器的測試結果不一致)
在浮點數末尾≤4或者≥6的情況下的捨入沒有爭議,但當末尾正好等於5的情況下可謂混亂之極。
總結:眾所周知,遵循IEEE754數值格式的語言的浮點計算會出現精度損耗的通病,ES也並非獨此一家,因此盡量不要進行某個特定浮點數值的測試,如:0.1+0.2;
解決方案:重寫Number.prototype.toFixed()方法: