web-dev-qa-db-ja.com

JavaScriptで浮動小数点を整数に変換するための最良の方法は何ですか?

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

これが私が知っているいくつかの方法です:

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

私はそこに他の人がいると確信しています。提案?

29
Mathew Byrne

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

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

数値を整数に丸めるには、Math.round、Math.ceil、Math.floorのいずれかが推奨されます。

38
Jason Bunting

Douglas Crockfordの「Javascript:TheGoodParts」から:

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
8
Ken Rosaka

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

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

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

グーグルはそれをキャッシュしました: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/

7
bcherry

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

これには数学ライブラリを使用してください。円形、天井または床関数。

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

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

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

4
AnthonyWJones

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

または、a.toFixed(0);

編集:

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

var num = 2.7;  // typeof num is "Number"
num.toFixed(0) == "3"
3
davenpcj
var i = parseInt(n, 10);

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

2
Walter Rumsby

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

関数が引数valueを取り、関数がvalueが常に整数でなければならない(そして0が受け入れられる)ように機能するとします。次に、次のいずれかが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()と比較するためにいくつかのパフォーマンステストを行いますが、Errorsがスローされず、非0を取得するという特別な利便性が好きです。 -数字

1
arunjitsingh

そこで、入力がすでに数値である場合のChromeでベンチマークを作成しましたが、最速は~~numおよびnum|0、半分の速度:Math.floor、そして最も遅いのはparseIntです ここ を参照してください

benchmark result

[〜#〜]編集[〜#〜]丸め ベンチマークを作成した別の人がすでにいるようです(詳細結果)および追加 方法num>>0 (できるだけ速く |0)およびnum - num%1(時々速い)

1
Kokizzu

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

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

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

0
Andrew Hedges