web-dev-qa-db-ja.com

JavaScriptで浮動小数点数を整数に変換する方法

JavaScriptでfloatを整数に変換したいのですが。実際には、標準変換の両方をどのように行うか(切り捨てと四捨五入による)を知りたいです。そして効率的に、文字列への変換や解析を介さずに。

957
mcherm

ビットごとの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テスト は、4つのうちMathが現在最も遅いをチェックする追加の記号のためにそれがかなり明白であるところで同じことを比較します。

注意

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

1234567890  | 0 => 1234567890
12345678901 | 0 => -539222987
275
Robert Koritnik

注:Math.floor()をtruncateの代わりに使用することはできません。なぜなら、Math.floor(-3.1) = -4-3ではないからです。

切り捨ての正しい置き換えは次のようになります。

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

    return Math.floor(value);
}
91
user189987

Double bitwise not 演算子は、floatを切り捨てるために使用できます。あなたが言及した他の操作は Math.floorMath.ceil 、および Math.round を通して利用可能です。

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

詳細はJames Padolseyによる。

42
brad

切り捨ての場合

var intvalue = Math.floor(value);

ラウンドの場合:

var intvalue = Math.round(value);
38
Mike

丸めなしの場合は parseInt メソッドを使用できます。 0x(16進)および0(8進)のプレフィックスオプションがあるため、ユーザー入力には注意してください。

var intValue = parseInt(floatValue, 10);
22
Graeme Wicksted

0によるビットシフト、これは1による除算に相当します

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
17
Prasanth

あなたの場合、(カンマを挿入するために)末尾に文字列が必要なときは、単にNumber.toFixed()関数を使用することもできます。

7
Russell Leggett

ここにはたくさんの提案があります。ビットごとのORは、これまでで最も単純なようです。これは、モジュロ演算子を使用して負の数でも機能するもう1つの短い解決策です。ビット単位のORよりも理解しやすいでしょう。

intval = floatval - floatval%1;

このメソッドは、 '| 0'も '~~'も '>> 0'も正しく動作しない大きな値の数に対しても動作します。

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
6
Juliane Holzt

もう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/ /

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
1
Razor

あなたがangularjsを使っているなら、HTMLテンプレートバインディングではのように簡単な解決

{{val | number:0}} 

valを整数に変換します

docs.angularjs.org/api/ng/filter/number の順に進んでください

0
Jameel Grand

JavaScriptでネイティブのMathオブジェクトを調べると、数値や値などを処理するためのたくさんの関数が得られます。

基本的にあなたがやりたいことはJavaScriptで非常にシンプルでネイティブです...

以下の番号があると想像してください。

const myValue = 56.4534931;

そして今、あなたが最も近い数にそれを切り捨てたいならば、単にそうしなさい:

const rounded = Math.floor(myValue);

そしてあなたが得る:

56

あなたが最も近い数にそれを切り上げたいならば、ちょうどしなさい:

const roundedUp = Math.ceil(myValue);

そしてあなたが得る:

57

また、Math.roundはそれをより高いまたはより低い数に丸めるだけで、どちらがフロート数に近いかによって異なります。

フロート数の後ろに~~を使用することもできます。これはフロートを整数に変換します。

~~myValue...のように使うことができます。

0
Alireza

私はただ金銭的にあなたが丸くしたい、そして切捨てたくないことを指摘したい。 4.999452 * 100を丸めると5が得られるため、ペニーで降りることはほとんどありません。より代表的な答えです。

そしてそれに加えて、 銀行家の四捨五入 を忘れないでください。

JavaScriptでのガウス/銀行家の四捨五入

0
Gerard ONeill