JavaScriptで数値を切り捨てる方法を教えてください。


228

JavaScriptで数値を切り捨てる方法を教えてください。

math.round() 小数点以下を四捨五入するため、機能しません。

最初のビットを維持する際に小数点で分解する以外に、より良い方法があるかどうかはわかりません。がなければならない...


21
ゼロに向かって、または負の無限大に向かって丸めますか?
DanielBrückner、

回答:



60

負の無限大に向かって丸める- Math.floor()

+3.5 => +3.0
-3.5 => -4.0

ゼロへの丸め(通常はと呼ばTruncate()れますが、JavaScriptではサポートされていません)はMath.ceil()、負の数とMath.floor()正の数に使用することでエミュレートできます。

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()

完全性に感謝しますが、大文字と小文字が正しくありません...そして、大きな違いをもたらすjava-scriptです。そうでなければ、私はここで賛成票を投じていただろう。
ジョージ

大文字と小文字が正しくなるように答えを更新しました。
chasen

18
@ジョージ巨大か巨大か?:D
m93a 2013年

1
を介してゼロへの丸めと同じ効果を得ることができますx | 0
Ahmed Fasih、2016年

28

Math.floor()OR動作しますが、ビット単位の演算を使用する場合と比較すると非常に遅くなります。

var rounded = 34.923 | 0;
alert( rounded );
//alerts "34"

EDIT Math.floor()は、|を使用するよりも遅くはありません。オペレーター。私の仕事をチェックしてくれたJason Sに感謝します。

テストに使用したコードは次のとおりです。

var a = [];
var time = new Date().getTime();
for( i = 0; i < 100000; i++ ) {
    //a.push( Math.random() * 100000  | 0 );
    a.push( Math.floor( Math.random() * 100000 ) );
}
var elapsed = new Date().getTime() - time;
alert( "elapsed time: " + elapsed );

11
??? 私は、Spidermonkey 1.7を使用するjsdb(www.jsdb.org)を実行し、ループを実行して、最初にMath.floor()で100000浮動小数点数の配列のx [i]のフロア値を合計しました。次に、ビットごとまたはあなたが示唆するように。ほぼ同じ時間、125ミリ秒かかりました。
Jason S

4
500000の浮動小数点数でテストを繰り返しただけで、ほぼ同じ時間、約625ミリ秒かかりました。
Jason S

5
したがって、1.25usecが非常に遅いのがわかりません。
Jason S

3
あなたのデータについて議論することはできません:)私はJSの実装とActionScriptの実装を混同しているのではないかと思います(EcmaScript上に構築されています。明らかに実装は異なります)。私の仕事をチェックしてくれてありがとう!
geraldalewis 2009

14
彼らも同じことをしません。|32ビット整数に変換し、切り捨てます。Math.floor切り捨てます。jsfiddle.net/minitech/UVG2w
Ry-

21

特定の小数点以下の桁数に切り捨てる必要がある場合は、この関数を使用してみることができます

function roundDown(number, decimals) {
    decimals = decimals || 0;
    return ( Math.floor( number * Math.pow(10, decimals) ) / Math.pow(10, decimals) );
}

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990

このようなワンライナーは関数を必要としないと思います。
Hubert Grzeskowiak 2015

4
roundDown(4.56、2)は4.55を与えるので、良い解決策ではないと思います。
2016年

6

負の無限大に切り捨てるには、以下を使用します。

rounded=Math.floor(number);

ゼロに向かって切り捨てる(数値が-2147483648から2147483647の間の32ビット整数に丸めることができる場合)には、以下を使用します。

rounded=number|0;

(任意の数の)ゼロに向けて切り捨てるには、以下を使用します。

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);

5

丸めnumberに向かって0、その署名された小数部を減算することによって行うことができますnumber % 1

rounded = number - number % 1;

同様にMath.floor(向けたラウンド-Infinity)このメソッドは、完全に正確です。

取り扱いに違いがあり-0+Infinity-Infinityいえは:

Math.floor(-0) => -0
-0 - -0 % 1    => +0

Math.floor(Infinity)    => Infinity
Infinity - Infinity % 1 => NaN

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN

3
Math.floor(1+7/8)

1 + 7/8 = 1-Math.floor()はそれほど必要ありません:)
Jason Berry

18
実際には(7/8)+1で、1ではありません。3年生の代数をありがとう
Joe Phillips

1
うーん、実際にこれをJavaScriptプログラムで試してみてください。やった。(1 + 7/8)と表示すると、1.875と表示されます。Math.round(...)は2、Math.floor(...)は1です。皆さんは何について話しているのですか。
DigitalRoss

1
または、Firefoxエラーコンソールを開きます。またはFirebug。試すのは難しくありません。私はそれを試してみました。1 + 7/8はjsで1.875です。あなたはおそらくjsのすべての数学が浮動小数点であることを忘れましたか?
DigitalRoss

3
JavaScriptがすべてを浮動小数点で実行することを忘れがちです。他の多く言語では1 + 7/8は1ですが、jsでは実際には1.875です。
DigitalRoss

3

今日誰か他の人のコードをいじっていると、以下も切り捨てられているようです:

var dec = 12.3453465,
int = dec >> 0; // returns 12

符号伝播右シフト(>>)の詳細については、MDNビット演算子を参照してください。

これが何をしているかを理解するのにしばらく時間がかかりました:D

しかし、上記で強調したように、Math.floor()は機能し、私の意見ではより読みやすく見えます。


3
また、32ビットに収まらない場合は黙って数値を削除します。Chromiumコンソール:99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

半分を切り捨てるには-1を配置し、その後、下の例のように-1を掛けます。

<script type="text/javascript">

  function roundNumber(number, precision, isDown) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = 0;
    if (isDown) {
      tempNumber = -tempNumber;
      roundedTempNumber = Math.round(tempNumber) * -1;
    } else {
      roundedTempNumber = Math.round(tempNumber);
    }
    return roundedTempNumber / factor;
  }
</script>

<div class="col-sm-12">
  <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script>
  </p>
  <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p>
</div>

正直なところ、このコミュニティでは、上記の@phoebusのような回答を好みます。
Ankit Pandey

0

以下は、簡単な例で使用されているmath.floorです。これは、新しい開発者が関数でそれを使用する方法とその機能を理解するのに役立つ場合があります。それが役に立てば幸い!

<script>

var marks = 0;

function getRandomNumbers(){    //  generate a random number between 1 & 10
    var number = Math.floor((Math.random() * 10) + 1);
    return number;
}

function getNew(){  
/*  
    This function can create a new problem by generating two random numbers. When the page is loading as the first time, this function is executed with the onload event and the onclick event of "new" button.
*/
document.getElementById("ans").focus();
var num1 = getRandomNumbers();
var num2 = getRandomNumbers();
document.getElementById("num1").value = num1;
document.getElementById("num2").value = num2;

document.getElementById("ans").value ="";
document.getElementById("resultBox").style.backgroundColor = "maroon"
document.getElementById("resultBox").innerHTML = "***"

}

function checkAns(){
/*
    After entering the answer, the entered answer will be compared with the correct answer. 
        If the answer is correct, the text of the result box should be "Correct" with a green background and 10 marks should be added to the total marks.
        If the answer is incorrect, the text of the result box should be "Incorrect" with a red background and 3 marks should be deducted from the total.
        The updated total marks should be always displayed at the total marks box.
*/

var num1 = eval(document.getElementById("num1").value);
var num2 = eval(document.getElementById("num2").value);
var answer = eval(document.getElementById("ans").value);

if(answer==(num1+num2)){
    marks = marks + 10;
    document.getElementById("resultBox").innerHTML = "Correct";
    document.getElementById("resultBox").style.backgroundColor = "green";
    document.getElementById("totalMarks").innerHTML= "Total marks : " + marks;

}

else{
    marks = marks - 3;
    document.getElementById("resultBox").innerHTML = "Wrong";
    document.getElementById("resultBox").style.backgroundColor = "red";
    document.getElementById("totalMarks").innerHTML = "Total Marks: " + marks ;
}




}

</script>
</head>

<body onLoad="getNew()">
    <div class="container">
        <h1>Let's add numbers</h1>
        <div class="sum">
            <input id="num1" type="text" readonly> + <input id="num2" type="text" readonly>
        </div>
        <h2>Enter the answer below and click 'Check'</h2>
        <div class="answer">
            <input id="ans" type="text" value="">
        </div>
        <input id="btnchk" onClick="checkAns()" type="button" value="Check" >
        <div id="resultBox">***</div>
        <input id="btnnew" onClick="getNew()" type="button" value="New">
        <div id="totalMarks">Total marks : 0</div>  
    </div>
</body>
</html>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.