要解决您的两个原始问题/问题:
Math.round(num) 与 num.toFixed(0)
这里的问题在于错误地认为这些应该总是给出相同的结果。事实上,它们受不同的规则支配。例如,看看负数。因为Math.round
使用“四舍五入”作为规则,您将看到即使Math.round(-1.5)
计算为-1
也Math.round(1.5)
计算为2
。
Number.prototype.toFixed
,另一方面,根据规范的第 6 步,使用基本上等同于“距零的一半”作为规则,这基本上是说将负数视为正数,然后在结尾。因此,和是所有符合规范的浏览器中的真实陈述。请注意,这些值是字符串,而不是数字。此外,值得注意的是这两个和是(数量),由于运算符优先级。(-1.5).toFixed(0) === "-2"
(1.5).toFixed(0) === "2"
-1.5.toFixed(0)
-(1.5).toFixed(0)
=== -2
浏览器不一致
大多数现代浏览器——或者至少是你在撰写本文时可能会支持的 浏览器,除了IE——都应该正确实现规范。(根据Renee 的评论,toFixed
您在 Opera 中指出的问题已得到修复,大概是因为他们开始使用与 Chrome 相同的 JS 引擎。)仍然值得重申的是,即使规范在所有浏览器中一致实施,定义的行为在规范中,特别是对于toFixed
舍入,对于期望真正数学准确性的“凡人”JS 开发人员来说仍然有点不直观——参见Javascript toFixed Not Rounding和这个在 V8 JS 引擎上提交的“按预期工作”的错误示例.
结论
简而言之,这是两个不同的函数,具有两种不同的返回类型和两组不同的舍入规则。
正如其他人所建议的那样,我还想说“使用适合您特定用例的任何函数”(特别注意 的特性toFixed
,尤其是 IE 的错误实现)。正如其他人所提到的Math.round/ceil/floor
,我个人更倾向于推荐 , 的一些明确组合。 编辑: ...不过,在返回并阅读您的说明之后,您的用例(四舍五入为整数)肯定会调用恰当命名的Math.round
函数。