私は最近、JavaScriptで数値の小数部分を削除する他の方法をいくつか発見しましたMath.floor(n)
。具体的には、ダブルビット単位のNOT演算子~~n
を使用し、ビット単位または0で実行しますn|0
。
これらのアプローチの違いと、ある方法が別の方法よりも推奨されるさまざまなシナリオについて知りたいと思います。
私は最近、JavaScriptで数値の小数部分を削除する他の方法をいくつか発見しましたMath.floor(n)
。具体的には、ダブルビット単位のNOT演算子~~n
を使用し、ビット単位または0で実行しますn|0
。
これらのアプローチの違いと、ある方法が別の方法よりも推奨されるさまざまなシナリオについて知りたいと思います。
すべてのビット演算子のオペランドは、符号付き 32 ビット整数に変換されます。
Math.floor(2147483648) // 2147483648
2147483648 | 0 // 2147483648
~~2147483648 // 2147483648
Math.floor(2147483649) // 2147483649
2147483649 | 0 // -2147483647
~~2147483649 // -2147483647
したがって、Math.floor(); を使用します。
あなたのコードを見ている次の人に明確にして、を使用してくださいMath.floor()
。
1%〜40%のパフォーマンスの向上は、実際には価値がないため、コードを混乱させたり、保守を困難にしたりしないでください。
(ジョシュの答えに完全に同意します:明確で保守可能なコードを支持します。)
他のビット単位のアプローチについての説明は次のとおりです。
ビット単位の演算子は、32 ビット (符号付き) 整数のみを操作するため機能しますが、JavaScript の数値はすべて IEEE-754 値です。したがって、ビット単位の演算子のオペランドに発生する内部変換 (切り捨て、フロアではありません!) があります。
適用されたビット単位の演算 (たとえばn<<0
、~~n
またはn|0
) は、変換された値に対して「何もしない」恒等関数として機能します。つまり、これらのアプローチはすべて、ビット単位のオペランドに適用される同じ変換に依存しています。
n
負の数または [-2 31 , 2 31 -1]以外の値を試してください:
(-1.23|0) // -1
Math.floor(-1.23) // -2
var x = Math.pow(2, 40) + .5
x|0 // 0
Math.floor(x) // 1099511627776
ハッピーコーディング。