JavaScript番号から小数部分を削除するにはどうすればよいですか?


218

除算の結果があり、結果の数値の小数部分を破棄したいと思います。

これどうやってするの?

回答:


384

あなたは使うことができます...

...小数点を削除する方法に依存します。

Math.trunc()すべてのプラットフォーム(IE)ではまだサポートされていませんが、簡単にポリフィルを使用できますが、当面の間を。

優れたプラットフォームサポートで小数部分を切り捨てる別の方法は、ビットごとの演算子(.eg |0)を使用することです。数値にビット演算子を使用することの副作用は、そのオペランドを符号付き32ビット整数として扱うため、小数部分が削除されることです。これは32ビットを超える数値も処理することに注意してください。


また、浮動小数点演算での10進数の丸めの不正確さについて話しているかもしれません。

必読-浮動小数点演算についてすべてのコンピューター科学者が知っておくべきこと


29
数値が負の場合、数値Math.floor()増加することに注意してください。このように。(@FloydPinkで言及されているように)は、負の両方の数値で予想される小数部を破棄します。Math.floor(-1.2) -> -2Math.floor(1.2) -> 1parseInt(-1.2) -> -1
Paul T. Rawkeen 2014年

1
@ PaulT.Rawkeenビット単位演算子を使用して小数部分を削除することもできますが、32ビットに切り捨てられることにも注意してください。
アレックス、2014年

2
:この答えが不安定で、次のショー> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
ジェイク

4
@Jake 2.3*100javascript の結果は229.99999999999997であるため、例ではビット演算子が正しく機能しているようです。
Chad von Nau 2016

|064ビット整数を使用する同様のソリューションはありますか?
クリント

49

ビットごとの演算子を使用して、小数を切り捨てることもできます。

例えば

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

ビット演算は、数学関数よりもかなり効率的です。ダブルビット単位のないオペレータはまた少し上回るようだx | 0x << 0無視できる程度の量でビット演算を。

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

また、注目に値するのは、ビット単位のnot演算子が算術演算よりも優先されるため、意図した結果を得るには、計算を括弧で囲む必要がある場合があることです。

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

double bitwise not演算子の詳細については、Double bitwise NOT(~~)を参照してください。


2
わずかに効率的かもしれません。しかし、より読みやすい「数学」関数をお勧めします。
ashipj 2017

チャンス整数を32ビットの符号付き整数(として表現されていないときは、この作業をしないことであるstackoverflow.com/a/7488075/3655192
ヒロキ

30

あなたもすることができます

parseInt(a/b)

17
parseIntこれは、最初に引数を文字列に変換することで機能するため、大きな数では確実に機能しないことに注意してください。大きな数では、結果は指数表記を使用します。たとえば、var n = 22222222222222222222222; parseInt(n);はを返す2ため、がn.toString()返されます2.2222222222222223e+22

2
またparseInt()、文字列内の数値を取得してを返すという目的で使用していませんNumber
アレックス

22

uは、次のコードを使用して、小数点以下の特定の桁数(ここでは2桁)を表示することもできます。

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
toFixed()は数値ではなく文字列を返すことに注意してください。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Jeanmichelコート

1
これは、OPが小数部分を削除するように要求するときの答えです
Isaac

3
文字列を返しますが、Number()メソッドを使用して修正できます。Number((15.46974).toFixed(2))
iPzard



6

ES2015では、Math.trunc()を使用できます。

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

IE11以前ではサポートされていませんが、Edgeや他のすべての最新ブラウザーで機能します。


2
Xの小数点以下を切り捨てることができるバリエーションを知っていますか?それがうまくいくと考えるのは素朴Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)でしょうか?
jamiebarrow

2
ジェイミーさん、ほとんどの場合は問題ないようですが、浮動小数点の問題が発生しやすくなっています。例えばvalue = 2.3、そしてx = 2戻り2.29ます。これ以上の提案はありません。
Chad von Nau

これは正しい答えのように思えます。上限または下限を丸めません。負の数でも問題ありません。小数点を切り捨てるだけです。質問が尋ねたように。
エンリケモレノテント

2

ルーティングを気にしない場合は、数値を文字列に変換し、ピリオドを含むピリオド以降をすべて削除します。これは、小数があるかどうかに関係なく機能します。

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixedはラウンドのように動作します。

床のような動作の場合、%を使用します。

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
Math.floorを使用するよりも優れていると思うのはなぜですか?あなたのソリューションは不必要に複雑で遅いようです。Math.floorがどのように機能するかはわかりませんが、はるかに最適化されていると思います。また、あなたの解決策が浮動小数点の丸め誤差に悩まされるのではないかと思います。
Hans Roerdinkholder 2016

1

上記の投稿の助けを借りて、詳細な説明の圧縮があります:

1. Math.trunc():ドットが後に続く数字を削除するために使用されます。暗黙的に変換します。ただし、IEではサポートされていません。

例:

Math.trunc(10.5)// 10

Math.trunc(-10.5)// -10

その他の代替方法:ビットごとの否定演算子の使用:

例:

x = 5.5

~~ x // 5

2. Math.floor():可能な最小の整数値を与えるために使用されます。すべてのブラウザでサポートされています。

例:

Math.floor(10.5)// 10

Math.floor(-10.5)// -11

3. Math.ceil():可能な最大の整数値を与えるために使用されます。すべてのブラウザでサポートされています。

例:

Math.ceil(10.5)// 11

Math.ceil(-10.5)// -10

4. Math.round():最も近い整数に丸められます。すべてのブラウザでサポートされています。

例:

Math.round(10.5)// 11

数学ラウンド(-10.5)// -10

Math.round(10.49)// 10

Math.round(-10.51)// -11


0

ES6の実装では、次のようなものを使用します。

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

これは、ユーザーが10進数を入力するのを防ぎたい人向けです

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

.toFixed(0)を使用して、完全な小数部分を削除するか、小数を切り捨てるまでの引数の数を指定できます。

注:toFixedは数値を文字列に変換します。


0

例えば:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

または

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