Bagaimana saya bisa membulatkan angka dalam Javascript?

228

Bagaimana saya bisa mengumpulkan angka dalam JavaScript?

math.round() tidak berfungsi karena membulatkannya ke desimal terdekat.

Saya tidak yakin apakah ada cara yang lebih baik untuk melakukannya selain memecahnya pada titik desimal untuk menjaga bit pertama. Pasti ada...

Ben Shelock
sumber
21
Bulat menuju nol atau menuju infinity negatif?
Daniel Brückner

Jawaban:

60

Putaran menuju infinity negatif - Math.floor()

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

Putaran ke nol - biasanya disebut Truncate(), tetapi tidak didukung oleh JavaScript - dapat ditiru dengan menggunakan Math.ceil()angka negatif dan Math.floor()positif.

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()
Daniel Brückner
sumber
Terima kasih atas kelengkapannya tetapi kapitalisasi salah ... dan dalam java-script yang membuat perbedaan besar. Kalau tidak, saya akan dipilih di sini.
George
Saya telah memperbarui jawabannya sehingga kapitalisasi sekarang benar.
chasen
18
@ George BESAR atau besar? : D
m93a
1
Anda bisa mendapatkan efek yang sama seperti round-to-zero via x | 0.
Ahmed Fasih
28

Math.floor()akan bekerja, tetapi sangat lambat dibandingkan dengan menggunakan ORoperasi bitwise :

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

EDIT Math.floor() adalah tidak lebih lambat dari menggunakan | operator. Terima kasih kepada Jason S karena telah memeriksa pekerjaan saya.

Berikut kode yang saya gunakan untuk menguji:

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 );
geraldalewis
sumber
11
??? Saya hanya menjalankan jsdb (www.jsdb.org) yang menggunakan Spidermonkey 1.7, dan menjalankan loop untuk meringkas nilai floor'ed dari x [i] pada array 100000 angka floating point, pertama dengan Math.floor (), kemudian dengan bitwise atau seperti yang Anda sarankan. Butuh waktu yang kira-kira sama, 125 msec.
Jason S
4
Baru saja mengulang tes dengan 500000 angka floating point, butuh waktu yang kira-kira sama, kira-kira 625 msec.
Jason S
5
Jadi saya tidak melihat bagaimana 1.25usec sangat lambat.
Jason S
3
Tidak dapat berdebat dengan data Anda :) Saya pikir saya mungkin bingung implementasi JS dengan ActionScript (dibangun di EcmaScript; implementasi jelas berbeda). Terima kasih telah memeriksa pekerjaan saya!
geraldalewis
14
Mereka juga tidak melakukan hal yang sama. |mengkonversi ke integer 32-bit, memotong; Math.floorputaran ke bawah. jsfiddle.net/minitech/UVG2w
Ry-
21

Anda dapat mencoba menggunakan fungsi ini jika Anda perlu membulatkan ke tempat desimal tertentu

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

contoh

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990
Petr Hurtak
sumber
Saya pikir one-liner seperti ini tidak memerlukan fungsi.
Hubert Grzeskowiak
4
roundDown (4,56, 2) memberi Anda 4,55, jadi saya tidak berpikir itu solusi yang baik.
cryss
6

Untuk membulatkan ke arah infinity negatif, gunakan:

rounded=Math.floor(number);

Untuk membulatkan ke bawah ke nol (jika angka dapat membulatkan ke bilangan bulat 32-bit antara -2147483648 dan 2147483647), gunakan:

rounded=number|0;

Untuk membulatkan ke bawah ke nol (untuk nomor berapa pun), gunakan:

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number);
Mike Godin
sumber
5

Pembulatan numberke arah 0dapat dilakukan dengan mengurangi bagian fraksinya yang telah ditandatangani number % 1:

rounded = number - number % 1;

Seperti Math.floor(putaran menuju-Infinity ) metode ini sangat akurat.

Ada perbedaan dalam penanganan -0, +Infinitydan -Infinitymeskipun:

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

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

Math.floor(-Infinity)     => -Infinity
-Infinity - -Infinity % 1 => NaN
Robert
sumber
3
Math.floor(1+7/8)
DigitalRoss
sumber
1 + 7/8 = 1 - Tidak perlu untuk Math.floor () di sana :)
Jason Berry
18
Sebenarnya ini (7/8) +1 yang bukan 1. Terima kasih aljabar kelas 3
Joe Phillips
1
Umm, tolong coba ini di program javascript. Aku melakukannya. Tampilan (1 + 7/8) dan Anda akan melihat 1,875. Math.round (...) adalah 2, Math.floor (...) adalah 1. Apa yang kalian bicarakan?
DigitalRoss
1
Atau buka Konsol Kesalahan Firefox. Atau Firebug. Tidak sulit untuk dicoba. Saya mencobanya. 1 + 7/8 adalah 1,875 dalam js. Apakah Anda mungkin lupa bahwa semua matematika di js ada di floating point?
DigitalRoss
3
Mungkin mudah untuk melupakan bahwa javascript melakukan semuanya dalam floating point. Dalam banyak bahasa lain 1 + 7/8 adalah 1, tetapi dalam js itu benar-benar 1.875.
DigitalRoss
3

Sedang mengutak-atik kode elses seseorang hari ini dan menemukan yang berikut ini yang tampaknya bulat juga:

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

Untuk info lebih lanjut tentang pergeseran kanan Tanda-propagasi (>>) lihat MDN Bitwise Operators

Butuh beberapa saat untuk mencari tahu apa yang dilakukannya: D

Tetapi seperti yang disorot di atas, Math.floor () berfungsi dan terlihat lebih mudah dibaca menurut saya.

Alastair Hodgson
sumber
3
Ini juga secara diam-diam membunuh nomor Anda jika tidak muat dalam 32 bit. Konsol kromium: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs
0

Anda perlu meletakkan -1 untuk membulatkan setengah ke bawah dan setelah itu kalikan dengan -1 seperti contoh di bawah.

<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>
João Paulo Santarém
sumber
Jujur di komunitas ini, kami lebih suka jawaban seperti @phoebus yang diberikan di atas.
Ankit Pandey
0

Ini adalah math.floor yang digunakan dalam contoh sederhana. Ini mungkin membantu pengembang baru untuk mendapatkan ide bagaimana menggunakannya dalam suatu fungsi dan apa fungsinya. Semoga ini bisa membantu!

<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>
indranatha madugalle
sumber