关于tofixed函数解惑

奇怪的BUG

在保留有效数字的时候我们经常会使用到这个函数。但各个浏览器的实现有所不同:
Edge的实现:
571487750130_.pic_hd
Firefox的实现:

WX20170223-110507

Chrome的实现:

WX20170223-110320

Safari的实现:
WX20170223-110942
如果不仔细对比,就无法看出不同浏览器在toFixed函数实现上存在的差异。
这些差异是如何造成的呢?首先我们得从数值修约说起。在保留近似值的做法上,除了了我们熟悉的四舍五入,还有一种很少被提起的修约方法—-四舍六入五留双。关于“四舍六入五留双”这种规则,在维基百科是这样解释的。
62A77A24D66F5E852D4FB8A1D8E242B7
引入“四舍六入五留双”,是为了解决入得多舍得少的问题,在这之间达到平衡。然而各浏览器在toFixed上既没有把四舍五入做好,也没有按“四舍六入五留双”来实现,结果让人捉摸不透。

如何做到真正的四舍五入?

我们知道Math.round可以实现真正的四舍五入,我们可以这么解决:

这样子是不是就符合需求了呢?
WX20170223-154601

 

发散思维:如果要真是实现“四舍六入五留双”,该如何拓展呢?那就留给大家思考了?

附加参考链接:

http://stackoverflow.com/questions/42109818/reliable-js-rounding-numbers-with-tofixed2-of-a-3-decimal-number

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/round

https://zh.wikipedia.org/wiki/%E6%95%B0%E5%80%BC%E4%BF%AE%E7%BA%A6#.E5.9B.9B.E6.8D.A8.E5.85.AD.E5.85.A5.E4.BA.94.E6.88.90.E9.9B.99

http://baike.baidu.com/link?url=cbMxMCN4eZqg3eOimH6FzmA1YLJrZoPhPF-2HvYh_whe5Jib2A9QV0aVLXq9I1NSAYUNWvcMrqRQ2N4A-THrIa#4