Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中将浮点转换为int的最快方法?_Javascript_Performance_Casting_Numbers - Fatal编程技术网

在javascript中将浮点转换为int的最快方法?

在javascript中将浮点转换为int的最快方法?,javascript,performance,casting,numbers,Javascript,Performance,Casting,Numbers,假设我有x=12.345。在javascript中,哪个函数floatToInt(x)的运行时间最快,使得floatToInt(12.345)返回12?这是个好问题!前几天我真的不得不处理这件事!这可能看起来像是一个后路,只是写parseInt,但等待!我们可以更爱幻想 因此,我们可以在很多事情上使用位运算符,这似乎是一个很好的情况!假设我有你问题中的数字,12.345,我可以使用位运算符“~”,它将数字中的所有位反转,并在此过程中将数字转换为整数必须爱JS。 现在我们有了数字的倒转位表示,如果

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

这是个好问题!前几天我真的不得不处理这件事!这可能看起来像是一个后路,只是写parseInt,但等待!我们可以更爱幻想

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

现在我们有了数字的倒转位表示,如果我们再次“~”它,我们就得到了……鼓轮。。。。。。。。。我们的数字没有小数!不幸的是,它不能进行舍入

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

我们可以使用Math.round()来实现这一点。但是你来了!您可以在JSperf上尝试一下,看看您得到的速度有多快!希望有帮助

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

var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );
只要做: ~~(x+0.5)


干杯,Z.

算术或零运算就可以了

> 12 === (0 | 12.245)
true

有多个函数可以完成您的工作吗?只需使用
Math.round
(或
Math.floor
,具体取决于您的需要)。转换的速度真的值得生成可读性较差的代码吗?而且,您已经对代码进行了性能测试,发现整数转换是主要的瓶颈?我这样问是因为大多数时候人们花时间“加速”,他们实际上是在解决问题的错误部分,因此浪费了他们的时间,并且经常使代码复杂化,而没有太多或任何改进。@Bergi-你在森林里,看不到树。我问了一个简单的问题,只是想找到一个简单的答案,其实并不比这个复杂。不过,谢谢你的贡献@jfriend00:同意“没有明显的差别”,但是
Math.random
对于这类测试是非常必要的。它确保操作不会被优化编译器不断折叠。哦,微基准是很难的…所以,你写了一个问题的答案,询问“最快”的方法,在使用其他人的测试时没有显示出有意义的区别,而你没有时间自己做测试?除了转换为整数的“不同”方法之外,你还没有显示出你的答案。而且,我更惊讶的是,OP上钩了,似乎认为这是一种编写代码的好方法。@jfriend00:我认为你不能用JS提供的工具计算一个
数学.round
调用或
~
操作的时间。如果你正在给循环计时(就像jsperf那样),
Math.random()
必须进入循环体。但是我们可以合理地假设每个
Math.random()
调用都需要相同的时间(至少是平均时间),这样我们仍然可以比较其他操作的差异。@Bergi-我明白你关于设置代码的观点。我将其更改为只分配给
resultArray
,这样就不会干扰
testNumbers
数组,因此不需要
.slice()
,并且它总是在随机数上运行:。小心!使用
x=1000000000
Math.floor(x)==x
,但是
~~x==1410065408
<代码>数学地板(-0.5)==-1,但
~-0.5)==0