31

JavaScript で浮動小数点数を整数に変換するには、いくつかの方法があります。私の質問は、どの方法が最高のパフォーマンスを提供するか、最も互換性があるか、またはベストプラクティスと見なされるかです?

私が知っているいくつかの方法を次に示します。

var a = 2.5;
window.parseInt(a); // 2
Math.floor(a);      // 2
a | 0;              // 2

他にもいると思います。提案?

4

12 に答える 12

39

このウェブサイトによると:

parseInt は、浮動小数点数を整数に変換する手段として使用されることがあります。引数が数値型の場合、最初に文字列に変換されてから数値として解析されるため、そのタスクには非常に適していません...

数値を整数に丸めるには、Math.round、Math.ceil、および Math.floor のいずれかを使用することをお勧めします...

于 2008-09-25T04:01:02.807 に答える
10

どうやらビット単位で2倍になります-数字を床に置くための最速の方法ではありません:

var x = 2.5;
console.log(~~x); // 2

以前はここの記事でしたが、現在は404を取得しています:http://james.padolsey.com/javascript/double-bitwise-not/

Googleはそれをキャッシュしました:http://74.125.155.132/search?q=cache:wpZnhsbJGt0J:james.padolsey.com/javascript/double-bitwise-not/+double+bitwise+not&cd=1&hl=en&ct=clnk&gl=us

しかし、ウェイバックマシンはその日を節約します!http://web.archive.org/web/20100422040551/http://james.padolsey.com/javascript/double-bitwise-not/

于 2010-03-15T04:01:25.760 に答える
8

Douglas Crockford の「Javascript: The Good Parts」から:

Number.prototype.integer = function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
}

それを行うと、すべての Number オブジェクトにメソッドが追加されます。

次に、次のように使用できます。

var x = 1.2, y = -1.2;

x.integer(); // 1
y.integer(); // -1

(-10 / 3).integer(); // -3
于 2011-06-15T18:25:17.173 に答える
5

答えはすでに与えられていますが、明確にするために。

これには Math ライブラリを使用します。ラウンド、天井、または床関数。

parseInt は、文字列を int に変換するためのものですが、ここでは必要ありません

toFixed は、フロートを文字列に変換するためのものであり、ここで必要なものではありません

Math 関数は文字列との間の変換を行わないため、とにかく間違っている他の選択肢よりも高速になります。

于 2008-09-25T08:24:52.593 に答える
3

Number(a).toFixed(0); を使用できます。

または、 a.toFixed(0); だけでもかまいません。

編集:

これは切り捨てとは少し異なり、0 桁に丸められます。他の誰かが示唆したように、toFixed は生の整数ではなく文字列を返します。表示目的に役立ちます。

var num = 2.7;  // typeof num is "Number"
num.toFixed(0) == "3"
于 2008-09-25T04:00:09.377 に答える
2
var i = parseInt(n, 10);

のような基数値を指定しない場合、 は'010'8 進数として扱われます (したがって、結果は ではあり8ません10)。

于 2008-09-25T04:08:31.883 に答える
1

ビット演算子の使用。整数に変換する最も明確な方法ではないかもしれませんが、あらゆる種類のデータ型で機能します。

関数が引数 を取り、関数が常に整数valueでなければならない (そして 0 が受け入れられる) ように機能するとします。次に、次のいずれかが整数としてvalue割り当てられます。value

value = ~~(value)
value = value | 0;
value = value & 0xFF;   // one byte; use this if you want to limit the integer to
                        // a predefined number of bits/bytes

最良の部分は、これが数値である文字列(テキスト入力などから得られるもの)で機能すること~~("123.45") === 123です。数値以外の値は0、つまり、

~~(undefined) === 0
~~(NaN) === 0
~~("ABC") === 0

16 進数を文字列 (0xプレフィックス付き)として使用できます。

~~("0xAF") === 175

何らかの型強制が含まれていると思います。これらをparseInt()および と比較するためにいくつかのパフォーマンス テストを行いますが、スローされず、数値以外のを取得できるMath.floor()という特別な利便性が気に入っています。Errors0

于 2011-09-07T16:19:15.173 に答える
0

質問は、float から int への変換について具体的に尋ねているようです。私の理解では、これを行う方法は を使用することtoFixedです。そう...

var myFloat = 2.5;
var myInt = myFloat.toFixed(0);

Math.floor()よりもパフォーマンスが高いか低いかを誰かが知っていますNumber.toFixed()か?

于 2008-09-25T04:55:47.823 に答える
-1

このようにすることもできます:

var string = '1';
var integer = a * 1;
于 2008-09-25T22:40:02.053 に答える
-4

parseInt() はおそらく最良のものです。a | 0あなたが本当に望むことをしません(aが未定義またはnull値の場合、0を割り当てるだけです。つまり、空のオブジェクトまたは配列がテストに合格することを意味します)、およびMath.floorは何らかの型のトリックによって機能します(基本的にparseInt()バックグラウンドで)。

于 2008-09-25T03:56:49.850 に答える