JavaScriptで浮動小数点数を整数に変換する方法はいくつかあります。私の質問は、どの方法が最高のパフォーマンスを提供するか、最も互換性があるか、またはベストプラクティスと見なされるかということです。
これが私が知っているいくつかの方法です:
var a = 2.5;
window.parseInt(a); // 2
Math.floor(a); // 2
a | 0; // 2
私はそこに他の人がいると確信しています。提案?
このウェブサイト によると:
parseIntは、浮動小数点数を整数に変換する手段として使用されることがあります。引数が数値型の場合、最初に文字列に変換されてから数値として解析されるため、このタスクには非常に適していません。
数値を整数に丸めるには、Math.round、Math.ceil、Math.floorのいずれかが推奨されます。
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
どうやらビット単位で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/
答えはすでに与えられていますが、明確にするためです。
これには数学ライブラリを使用してください。円形、天井または床関数。
parseIntは、文字列をintに変換するためのものであり、ここでは必要ありません。
toFixedは、フロートを文字列に変換するためのものであり、ここで必要なものではありません
数学関数は文字列との間で変換を行わないため、とにかく間違っている他のどの選択肢よりも高速になります。
Number(a).toFixed(0);を使用できます。
または、a.toFixed(0);
編集:
これは0桁に丸められ、切り捨てとは少し異なります。他の誰かが示唆したように、toFixedは生の整数ではなく文字列を返します。表示目的に役立ちます。
var num = 2.7; // typeof num is "Number"
num.toFixed(0) == "3"
var i = parseInt(n, 10);
'010'
のような基数値を指定しない場合、8進数として扱われます(したがって、結果は8
ではなく10
になります)。
ビット演算子の使用。整数に変換する最も明確な方法ではないかもしれませんが、あらゆる種類のデータ型で機能します。
関数が引数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
を取得するという特別な利便性が好きです。 -数字
質問は、floatからintへの変換について具体的に尋ねているようです。私の理解では、これを行う方法はtoFixed
を使用することです。そう...
_var myFloat = 2.5;
var myInt = myFloat.toFixed(0);
_
Math.floor()
がNumber.toFixed()
よりもパフォーマンスが高いか低いかを誰かが知っていますか?