4

参考这篇文章: math-round-vs-hack

我们优化了数学函数。

我们使用(num+0.5)|0而不是Math.round().

但是有一个问题让人困惑,当 num > 2147483647 时,会得出错误的结果。

function round(n) {
    return (n + 0.5) | 0;
};

round(2147483648)将返回 -2147483648

根据维基百科:

2147483647 在计算

数字 2,147,483,647 也是 >computing 中 32 位有符号整数的最大值。因此,它是在流行的 CPU 上运行的许多编程语言中声明为 int 的变量的最大值,也是许多视频游戏的最大可能分数(或金额)。数字的出现通常反映了错误、溢出情况或缺失值。 [8] 同样,“(214) 748-3647”是表示为美国电话号码的数字序列,是网页上列出的最常见的电话号码。 [9] 用于 Unix 等操作系统的数据类型 time_t 是一个 32 位有符号整数 > 计算自 Unix 纪元开始以来的秒数(1970 年 1 月的午夜 UTC)。 [10] 可以用这种方式表示的最晚时间是>星期二 03:14:07 UTC,

我该如何处理这种情况以确保良好的性能?

4

1 回答 1

4

简短回答:使用 Math.round()

我会将整个练习归档在“为什么永远不应该进行微优化”下。看看这个小提琴:http: //jsfiddle.net/toxicsyntax/a5rWm/2/

以下是来自不同浏览器的一些结果:

  • Firefox 11:round:185ms bit_round:123ms(用于 100000000 次迭代)
  • Chrome 18:round:99ms bit_round:96ms(用于 100000000 次迭代)
  • IE 9:round:227ms bit_round:123ms(1000000次迭代)
  • iPhone 4,Safari:round 399ms,bit_round 32ms(1000000 次迭代)

当然,在最好的情况下,按位舍入函数比使用 Math.round() 快得多,但这真的重要吗?最坏的情况 Math.round() 仍然处理数百万轮公关。秒没有问题。

你需要做多少次四舍五入?我不希望您必须在 javascript 中对数字进行四舍五入,除了显示数字,即使您要显示数千个四舍五入的数字 pr。其次, Math.round() 对你来说仍然足够快。

更新

此外,关于一般的微优化,请务必查看 Coding Horror 中的文章:http: //www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater。 html

微优化很少是一个好主意。

于 2012-04-18T08:44:15.840 回答