JavaScriptで浮動小数点数を整数に変換するにはどうすればよいですか?


1110

JavaScriptで浮動小数点数を整数に変換したいのですが。実際、私は標準変換の両方を行う方法を知りたいです:切り捨てと丸めによる。そして効率的に、文字列に変換して解析するのではありません。


83
あなたがそれを知らなかった場合、JavaScriptのすべての数値は浮動小数点数です。仕様から:
いくつかの

6
4.3.20数値タイプ:数値タイプは、数値を表す値のセットです。ECMAScriptでは、値のセットは、特殊な「Not-a-Number」(NaN)値、正の無限大、負の無限大を含む、倍精度64ビット形式のIEEE 754値を表します。
いくつかの

9
はい、JavaScriptには明確な「整数」型はありませんが、この変換を行う必要があることは珍しくありません。たとえば、私のアプリケーションでは、ユーザーが数値(セントを含む場合もある)を入力しました。私はセントを切り捨ててコンマで表示しなければなりませんでした。ステップ1はintに変換することでした。
mcherm 2009

1
また便利:すべてのメソッドの速度比較jsperf.com/math-floor-vs-math-round-vs-parseint/33
c ..

1
@karl:フィールドへの入力を受け入れる場合、受け入れる文字を制御できるかもしれませんが、ユーザー入力を受け入れるだけでなく、Javascriptであらゆる種類の処理を行うことができます。それでも、ペーストのサポートなどに使用したい場合があります。
mcherm 2012年

回答:


1609
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );

// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );

数学オブジェクトのリファレンス


ポジティブ
// value=x        //  x=5          5<x<5.5      5.5<=x<6  

Math.floor(value) //  5            5            5
Math.ceil(value)  //  5            6            6
Math.round(value) //  5            5            6
Math.trunc(value) //  5            5            5
parseInt(value)   //  5            5            5
~~value           //  5            5            5
value | 0         //  5            5            5
value >> 0        //  5            5            5
value >>> 0       //  5            5            5
value - value % 1 //  5            5            5
// value=x        // x=-5         -5>x>=-5.5   -5.5>x>-6

Math.floor(value) // -5           -6           -6
Math.ceil(value)  // -5           -5           -5
Math.round(value) // -5           -5           -6
Math.trunc(value) // -5           -5           -5
parseInt(value)   // -5           -5           -5
value | 0         // -5           -5           -5
~~value           // -5           -5           -5
value >> 0        // -5           -5           -5
value >>> 0       // 4294967291   4294967291   4294967291
value - value % 1 // -5           -5           -5
正-数値が大きい
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1

// value=x            x=900719925474099    x=900719925474099.4  x=900719925474099.5

Math.floor(value) //  900719925474099      900719925474099      900719925474099
Math.ceil(value)  //  900719925474099      900719925474100      900719925474100
Math.round(value) //  900719925474099      900719925474099      900719925474100
Math.trunc(value) //  900719925474099      900719925474099      900719925474099
parseInt(value)   //  900719925474099      900719925474099      900719925474099
value | 0         //  858993459            858993459            858993459
~~value           //  858993459            858993459            858993459
value >> 0        //  858993459            858993459            858993459
value >>> 0       //  858993459            858993459            858993459
value - value % 1 //  900719925474099      900719925474099      900719925474099
負-数値が大きい
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1

// value = x      // x=-900719925474099   x=-900719925474099.5 x=-900719925474099.6

Math.floor(value) // -900719925474099     -900719925474100     -900719925474100
Math.ceil(value)  // -900719925474099     -900719925474099     -900719925474099
Math.round(value) // -900719925474099     -900719925474099     -900719925474100
Math.trunc(value) // -900719925474099     -900719925474099     -900719925474099
parseInt(value)   // -900719925474099     -900719925474099     -900719925474099
value | 0         // -858993459           -858993459           -858993459
~~value           // -858993459           -858993459           -858993459
value >> 0        // -858993459           -858993459           -858993459
value >>> 0       //  3435973837           3435973837           3435973837
value - value % 1 // -900719925474099     -900719925474099     -900719925474099

82
別の回答で述べたように、ネガティブセーフトランケートはを使用して実行できますvar intValue = ~~floatValue;。表記があなたの好みにあいまいすぎる場合は、関数で非表示にするだけです:function toInt(value) { return ~~value; }。(これは、必要に応じて文字列を整数に変換します。)
Keen

4
この回答に入力/出力の例がある場合は賛成票を投じます。
J.ランダムコーダー2015

7
コメントに関して~~は値を32ビットの符号付き整数に制限しますが、Math.floor / ceil / roundは最大53ビットを処理できます(Number.MAX_SAFE_INTEGER 9007199254740991)。これは以下の回答で言及されていますが、これらのコメントを読んでいる人にはここで繰り返す価値があります。
ジョン

2
いくつかの場所で下から読んでください:Math.trunc(val);これは承認された回答なのでコメントします
Old Badman Grey

次のような値の正確な精度では動作しません2.3 - 2.3 % 1
Lapys

301

ビットごとのOR演算子

ビットごとのor演算子を使用して浮動小数点の数値を切り捨てることができ、正と負の両方で機能します。

function float2int (value) {
    return value | 0;
}

結果

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

性能比較?

以下のパフォーマンスを比較するJSPerfテストを作成しました。

  • Math.floor(val)
  • val | 0 ビットごとのOR
  • ~~val ビットごとのNOT
  • parseInt(val)

正の数でのみ機能します。この場合、Math.floor関数と同様にビット単位の演算を使用しても安全です。

ただし、コードがポジティブとネガティブの両方で機能する必要がある場合は、ビット単位の演算が最も高速です(ORが優先されます)。この他のJSPerfテストは同じことを比較しますが、追加の符号チェックのため、Mathが 4つのうちで最も遅いことが明らかです。

注意

コメントで述べたように、BITWISE演算子は符号付き32ビット整数で動作するため、大きな数が変換されます。例:

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987

@FabioPoloni:はい、とてもシンプルで、ビット単位の演算子が最速のようです。特に、負の数もサポートする必要がある場合、数値演算の追加のチェックが追加されるため、OR演算子は常にNOT演算とMath演算に一致する最速ですが、Math演算は最も低速です。
Robert Koritnik 2013年

9
@thefourtheye:符号なし右シフトを除くすべてのビット演算は、符号付き32ビット整数で機能します。したがって、浮動小数点値でビットごとの演算を使用すると、小数点以下の数字を取り除いた整数に変換されます。
Robert Koritnik 2013

3
正の数値に必要なだけの場合Math.floor()は、高速です(少なくとも、Google Chromeでの最初のJSPerfテストの実行によると、バージョン30.0.1599.101)、より堅牢です(数値がビットでどのように表されるかに依存しないため、これは、このビットごとのソリューションを変更し、場合によっては壊す可能性があります)、最も重要なのは、より明示的です。
ma11hew28 2013年

8
ビット演算子は32ビットの数値を操作することに注意してください。これらは、32ビットに収まらないほど大きな数では機能しません。
Kat 2013年

2
~~単項演算子なので、より優れています。4.2|0+4等しい4~~4.2+4等しい8
Janus Troelsen、2015年

94

注:Math.floor()切り捨ての代わりとして使用することはできませMath.floor(-3.1) = -4-3

truncateの正しい置き換えは次のとおりです。

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

1
これは、負の数の望ましい動作に依存します。より負の値(-3.5-> -4)にマップするために負の数が必要な用途もあれば、小さい整数(-3.5-> -3)にマップする必要がある用途もあります。前者は通常「フロア」と呼ばれています。「切り捨てる」という言葉は、どちらの動作を表す場合にもよく使用されます。私の場合、私はそれに負の数を与えるだけでした。しかし、このコメントは、負の数の振る舞いを気にする人にとって有用な警告です。
mcherm 2009年

28
@mcherm:その場合、彼らは「切り捨て」という用語を正しく理解していないようです。Truncateは、その名前が示すように、数字を切り捨てます。これは、(一般的な意味で)床や天井に相当するものではありません。en.wikipedia.org/wiki/Truncation
Thanatos

5
Math.trunc(value)ECMAScript 6
4esn0k 2014

2
floor-∞にtruncate向かって丸め、ゼロに向かって丸めます。(ceil+無限大に丸めます)。
Peter Cordes 2017

46

double ビット単位のnot演算子を使用して、floatを切り捨てることができます。あなたが言及した他の操作ができているMath.floorMath.ceilMath.round

> ~~2.5
2
> ~~(-1.4)
-1

詳細はJames Padolseyの厚意による。


1
これはおそらく、生産コードのために行うには悪いことである(それはあいまいなので)それは私が、コードゴルフをするために必要な正確に何をした私の<canvas>JSのフォントレンダリングエンジンを。ありがとうございました!
Kragen Javier Sitaker

10
これは、n | 0.
ジェイダグラス

17
どちらの方法(~~ nまたはn | 0)も、2 ^ 31-1または2147483647までの数値でのみ機能することに注意してください。2147483648以上では、誤った結果が返されます。たとえば、2147483647 | 0は-2147483648を返し、4294967295 | 0は-1を返します。これはほぼ間違いなく、希望どおりではありません。
Ed Bayiates

40

切り捨ての場合:

var intvalue = Math.floor(value);

ラウンド:

var intvalue = Math.round(value);

6
Math.floorは負の値を切り捨てません。上記の回答を参照してください。そうでなければいい答え。
オリゴフレン

パフォーマンスに関心がある場合は、jsperf.com / dsafdgdfsaf / 2(var | 0 wins here)という小さなテストケースをここに配置しました。
Cybolic

25

parseIntメソッドを使用して丸めを行わないことができます。0x(16進数)および0(8進数)の接頭辞オプションのため、ユーザー入力に注意してください。

var intValue = parseInt(floatValue, 10);

1
これは、.round、.ceil、および.floorが行うように、切り上げまたは切り捨てせずに、小数の整数部分だけが必要な場合に実際に役立ちます。
ユダガブリエルヒマンゴ2012年

1
...これを単に切り捨てる場合でも、最も遅い方法のようです。jsperf.com/float-to-int-conversion-comparison
Robert Koritnik 2012年

2
常に2番目の値をparseIntに渡して、期待するベースを指定します。したがって、parseInt(floatValue、10)は常にベース10を取得します
Tim Tisdall

3
これは古いですが、この質問はよく聞かれる質問のようですので、警告としてここに置きます。サイズが原因で値が「e」表記を使用して表される場合、期待される値ではなく、1桁になるだけです。たとえば、parseInt(1000000000000000000000, 10);結果は1 000 000 000 000 000 000 000ではなく1になります。とにかく、質問は明示的に望んでいませんでした "文字列に変換して解析することをが、それは比較的マイナーです...;)
Qantas 94 Heavy

4
@ Qantas94Heavyこの動作の理由は、最初のパラメータとして数値ではなく文字列をparseInt()期待するためです。この整数を渡すと、整数に変換されてから解析され、結果はになります。1e21parseInt1e211
Olaf Dietsche 2014年

18

1による除算と同等の0によるビットシフト

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2

4
小さなノートでは:>> 0<整数に対してのみ働くようで2 ^ 31-1、および>>> 0整数<ために2 ^ 32-1。これは、大きい値に対しては0を返します
Romuald Brunet 2014

@RomualdBrunet、はい、JavaScriptはすべてのビットごとの操作を32ビットの数値での操作として明確に定義しています。それは仕様にあります。
Alexis Wilke、2014年

これは、上記の回答で述べたように、Javascriptが32ビット(符号付き)整数でのみビット単位の演算を行うので機能します。したがって、何もしないように見えるビット操作(0のシフト、0とのOR、1とのAND、二重のNOTなど)でも、値を32ビット整数に変換するためにJavaScriptインタープリターが必要です。
FrankKrumnow


7

ここには多くの提案があります。ビット単位のORは、はるかに単純なようです。これは、モジュロ演算子を使用して負の数でも機能する別の短い解決策です。おそらくビット単位のORよりも理解しやすいでしょう。

intval = floatval - floatval%1;

このメソッドは、 '| 0'も '~~'も '>> 0'も正しく機能しない高い値の数値でも機能します。

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295

別の回答を参照する場合は、参照を追加するか、簡単にそのアイデアをスケッチしてください。
bertl 2013

5

するには切り捨て

// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 );  // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted

ラウンド

Math.round( 1.5 );  // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1

5

もう1つの可能な方法— XOR演算を使用します。

console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2

ビット演算の優先度は数学演算の優先度よりも低く、便利です。https://jsfiddle.net/au51uj3r/でお試しください


2

MathJavaScriptでネイティブオブジェクトを調べると、一連の関数全体で数値や値などを処理できます。

基本的にあなたがしたいことは非常に単純でJavaScriptでネイティブです...

以下の番号があるとします。

const myValue = 56.4534931;

そして、最も近い数値に切り捨てる場合は、次のようにします。

const rounded = Math.floor(myValue);

そしてあなたは得る:

56

四捨五入したい場合は、次のようにします。

const roundedUp = Math.ceil(myValue);

そしてあなたは得る:

57

また Math.roundそれをより高い数値またはより低い数値に丸めることは、どちらがフロット数に近いかに依存します。

また使用できます ~~、float後ろて、floatを整数に変換する。

次のように使用できます~~myValue...


~~数がint 32制限より大きい場合は、値がint 32制限値に変更されるため、注意してください。
マチャド

1

//Convert a float to integer

Math.floor(5.95)
//5

Math.ceil(5.95)
//6

Math.round(5.4)
//5

Math.round(5.5)
//6

Math.trunc(5.5)
//5

//Quick Ways
console.log(5.95| 0)
console.log(~~5.95) 
console.log(5.95 >> 0)
//5


0

切り捨てではなく、金銭的に丸めたいことを指摘したいだけです。ペニーによってオフになっている可能性ははるかに低くなります。4.999452* 100を丸めると、より代表的な答えである5が得られるからです。

その上で、銀行の丸めも忘れないでください。これは、直線的な丸めがもたらすわずかにプラスのバイアスに対抗する方法です。金融アプリケーションではそれが必要になる場合があります。

JavaScriptでのガウス/バンカーの丸め


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.