【问题标题】:Fastest way to cast a float to an int in javascript?在javascript中将浮点数转换为int的最快方法?
【发布时间】:2016-03-08 17:49:58
【问题描述】:

假设我有x = 12.345。在javascript中,哪个函数floatToInt(x)运行时间最快,使得floatToInt(12.345)返回12

【问题讨论】:

  • 是否有多种功能可以完成您的工作?
  • 只需使用Math.round(或Math.floor,取决于您的需要)。
  • 转换速度真的值得编写可读性较差的代码吗?
  • 而且,您已经对代码进行了性能测试,发现整数转换是主要瓶颈?我之所以这样问,是因为人们大部分时间都花时间“加快速度”,他们实际上是在处理问题的错误部分,因此浪费了他们的时间,并且经常使他们的代码复杂化而没有太多或任何改进。
  • @Bergi - 你在森林里,看不到树。我问了一个简单的问题,只是在寻找一个简单的答案,没有比这更复杂的了。不过,感谢您的贡献!

标签: javascript performance casting numbers


【解决方案1】:

好问题!前几天我实际上不得不处理这个问题!只写 parseInt 似乎是一个 goto,但请稍等!我们可以变得更漂亮。

所以我们可以在很多事情上使用位运算符,这似乎是一个很好的情况!假设我有您问题中的数字 12.345,我可以使用位运算符“~”来反转您数字中的所有位,并在此过程中将数字转换为 int! 一定要爱上 JS。

所以现在我们有了数字的反转位表示,然后如果我们再次“~”它,我们就会得到........鼓声......我们的数字没有小数!不幸的是,它不进行四舍五入。

var a = 12.345;
var b = ~~a; //boom!

我们可以为此使用 Math.round()。但是你去吧!您可以在 JSperf 上尝试一下,看看您获得的轻微加速!希望对您有所帮助!

【讨论】:

  • 在没有文档或支持证据表明您的方法在多个浏览器中更快的“最快”问题的答案丢失了很多。它可能更快,但您应该证明它在多个浏览器中实际上更快。
  • @jfriend00:同意“没有任何意义的区别”,但Math.random 对于此类测试非常必要。它确保优化编译器不会对操作进行常量折叠。哦,微基准测试很难……
  • 所以,你写了一个问题的答案,要求“最快”的方法在使用别人的测试时没有任何意义,而你没有时间自己做一个测试?除了转换为 int 的“不同”方法之外,您没有显示您的答案。而且,我更惊讶于 OP 上钩了,并且似乎认为这是一种很好的编码方式。
  • @Bergi - 我明白你关于设置代码的观点。我将其更改为仅分配给resultArray,因此testNumbers 数组永远不会受到干扰,因此不需要.slice(),它始终在随机数上运行:jsperf.com/float-to-int-conversion-comparison/30
  • 小心!使用x = 10000000000Math.floor(x) === x,但~~x === 1410065408 Math.floor(-0.5) === -1,但 ~~(-0.5) === 0
【解决方案2】:

我认为这是一个很好的例子

var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );

【讨论】:

    【解决方案3】:

    只要做: ~~(x + 0.5)

    干杯,Z。

    【讨论】:

      【解决方案4】:

      算术 OR 与零可以解决问题。

      > 12 === (0 | 12.245)
      true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2013-02-17
        • 2010-09-12
        • 2020-01-20
        • 2014-09-03
        • 2023-01-29
        相关资源
        最近更新 更多