web-dev-qa-db-ja.com

丸めなしでJavaScriptでdoubleをintに変換する

C#では、次のコードは2を返します。

double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);

ただし、JavaScriptでは、「double」を「int」に変換する唯一の方法は、Math.round/floor/toFixedなどを使用することです。Javascriptで丸めずにintに変換する方法はありますか? Number()のパフォーマンスへの影響を認識しているため、可能な限り文字列に変換することは避けたいです。

52
RSH1

parseInt()を使用します。

var num = 2.9
console.log(parseInt(num, 10)); // 2

|を使用することもできます。

var num = 2.9
console.log(num | 0); // 2
132
kubetz

「parseInt」は設計によりstringsで動作するため、「parseInt」の提案は非常に好奇心が強いと思います。そのため、その名前に「解析」という単語が含まれています。

関数呼び出しを完全に回避するトリックは

var truncated = ~~number;

「〜」単項演算子を二重に適用すると、倍精度値の切り捨てられたバージョンが残ります。ただし、数値を整数と見なすことを暗黙的に伴う他のすべてのJavaScript操作(配列のインデックス付けやビット演算子など)と同様に、値は32ビット精度に制限されます。

edit—かなり後の更新で、~~トリックは、値をビット単位でORでゼロにすることです。

var truncated = number|0;
50
Pointy

単にparseInt()を使用し、基数を必ず含めて、予測可能な結果が得られるようにしてください。

parseInt(d, 10);
7
Justin Niessner

Javascriptにはintのようなものはありません。すべてのNumbersは実際にはバックグラウンドで2倍*になっているため、CやC#のように型システムに依存して丸め順序を発行することはできません。

精度の問題を心配する必要はありません(doubleは2 ^ 53までの整数を正しく表すため)が、最も近い整数に丸めたい場合は、Math.floor(または他の同等のトリック)を使用することにこだわっています。


*ほとんどのJSエンジンは、可能な場合はネイティブintを使用しますが、すべてのJS番号はすべて、二重のセマンティクスを持つ必要があります。

5
hugomg

標準ライブラリのみを使用した(int)へのC#キャストと同様:

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
1
Roland

@Quentinと@Pointyがコメントで指摘したように、文字列を整数に変換するように設計されているため、parseInt()を使用することはお勧めできません。 10進数を渡すと、最初に数値が文字列に変換され、次に整数にキャストされます。 Math.trunc()Math.floor()、_~~num_、_~~v_、_num | 0_、_num << 0_、または_num >> 0_を使用することをお勧めしますニーズに応じて。 このパフォーマンステスト は、parseInt()Math.floor()のパフォーマンスの違いを示しています。また、 この投稿 は提案された方法の違いを説明しています。

0
1man