当num>时,按位或导致溢出2147483647

时间:2012-04-18 08:18:35

标签: javascript optimization

参考这篇文章: 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也是>计算中32位有符号整数的最大值。因此,在流行的CPU上运行的许多>编程语言中声明为int的变量的最大值,以及许多视频游戏的最大可能分数(或金额>)。数字的出现通常反映出错误,>溢出条件或缺失值。[8]同样,"(214)748-3647"是表示为美国电话号码的>数字序列,是网页上列出的最常见的电话号码> [9]   在诸如Unix之类的操作系统上使用的数据类型time_t是32位有符号整数>计算自Unix纪元开始以来的秒数(午夜UTC的1> 1970年1月)。[10]可以这种方式表示的最新时间是03:14:07 UTC on> 2038年1月19日星期二(对应于> epoch开始以来的2,147,483,647秒),因此使用32位time_t类型的系统是易受2038年问题影响。[11]

如何处理这种情况以确保良好的表现?

1 个答案:

答案 0 :(得分:3)

简答:使用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: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

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