Javascript'te bir sayıyı nasıl yuvarlayabilirim?


228

JavaScript'te bir sayıyı nasıl yuvarlayabilirim?

math.round() çalışmaz çünkü en yakın ondalık sayıya yuvarlar.

İlk biti tutmak için ondalık noktada ayırmak dışında bunu yapmanın daha iyi bir yolu olup olmadığından emin değilim. Olmalı...


21
Sıfıra mı yoksa negatif sonsuza mı?
Daniel Brückner

Yanıtlar:



60

Negatif sonsuza yuvarlama - Math.floor()

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

Sıfıra doğru yuvarlama - genellikle denir Truncate(), ancak JavaScript tarafından desteklenmez - Math.ceil()negatif sayılar ve Math.floor()pozitif sayılar kullanılarak taklit edilebilir .

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

Bütünlük için teşekkür ederim ama büyük harf kullanımı yanlış ... ve java-script büyük bir fark yaratıyor. Aksi takdirde burada iptal olurdum.
George

Cevabı, büyük / küçük harflerin artık doğru olması için güncelledim.
Chasen

18
@George BÜYÜK veya muazzam? : D
m93a

1
İle sıfıra yuvarlama ile aynı efekti elde edebilirsiniz x | 0.
Ahmed Fasih

28

Math.floor()çalışacak, ancak bitsel bir ORişlem kullanmaya kıyasla çok yavaş :

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

DÜZENLEME Math.floor() olduğu değil kullanmaktan daha yavaş | Şebeke. Çalışmamı kontrol ettiği için Jason S'ye teşekkürler.

İşte test etmek için kullandığım kod:

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
??? Ben sadece Spidermonkey 1.7 kullanan jsdb (www.jsdb.org) koştum ve 100.000 kayan nokta sayısı dizisinde x [i] 'in floor'ed değerini özetlemek için bir döngü çalıştırdım, önce Math.floor (), sonra bitsel veya önerdiğiniz gibi. Aynı süreyi 125 milisaniye aldı.
Jason S

4
Testi sadece 500000 kayan nokta sayısı ile tekrarladı, yaklaşık aynı zamanı aldı, yaklaşık 625 msn.
Jason S

5
Bu yüzden 1.25usec'in çok yavaş olduğunu görmüyorum.
Jason S

3
Verilerinizle tartışamıyorum :) JS'nin uygulamasını ActionScript'lerle karıştırmış olabileceğimi düşünüyorum (EcmaScript üzerine kurulu; açıkçası uygulama farklı). İşimi kontrol ettiğiniz için teşekkürler!
geraldalewis

14
Onlar da aynı şeyi yapmıyorlar. |32 bit tam sayıya dönüştürür, kesilir; Math.flooraşağı yuvarlar. jsfiddle.net/minitech/UVG2w
Ry-

21

Belirli sayıda ondalık basamağa yuvarlamanız gerekiyorsa bu işlevi kullanmayı deneyebilirsiniz

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

örnekler

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

Bunun gibi bir astarın bir işlev gerektirmediğini düşünüyorum.
Hubert Grzeskowiak

4
roundDown (4.56, 2) size 4.55 verir, bu yüzden iyi bir çözüm olduğunu düşünmüyorum.
cryss

6

Negatif sonsuza yuvarlamak için şunu kullanın:

rounded=Math.floor(number);

Sıfıra doğru yuvarlamak için (sayı -2147483648 ile 2147483647 arasında 32 bit tam sayıya yuvarlanabilirse) kullanın:

rounded=number|0;

Sıfıra (herhangi bir sayı için) yuvarlamak için şunu kullanın:

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

5

Bir Yuvarlama numberdoğru 0onun imzalı kesirli kısmı çıkarılarak yapılabilir number % 1:

rounded = number - number % 1;

Gibi Math.floor(doğru yuvarlar -Infinity) bu yöntem mükemmel doğrudur.

Orada işlenmesi farklılıklar vardır -0, +Infinityve -Infinityolsa:

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 () orada çok fazla gerek yok :)
Jason Berry

18
Aslında 1 değil (7/8) +1. Teşekkür ederim 3. sınıf cebir
Joe Phillips

1
Umm, lütfen bunu bir javascript programında deneyin. Yaptım. Ekran (1 + 7/8) ve 1.875'i göreceksiniz. Math.round (...) 2, Math.floor (...) 1'dir. Siz neden bahsediyorsunuz?
DigitalRoss

1
Veya Firefox Hata Konsolu'nu açın. Veya Firebug. Denemek zor değil. Denedim. 1 + 7/8, js cinsinden 1.875'tir. Muhtemelen js'deki tüm matematiklerin kayan noktada olduğunu unuttunuz mu?
DigitalRoss

3
Javascript'in her şeyi kayan noktada yaptığını unutmak muhtemelen kolaydır. Birçok olarak diğer dillere 1 + 8/7 1 olmakla js gerçekten 1,875 olduğunu.
DigitalRoss

3

Bugün bir başkasının kodu ile uğraştı ve aşağıdaki gibi de bulundu:

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

İşaret ilerletme sağ kaydırma (>>) hakkında daha fazla bilgi için bkz. MDN Bitwise Operators

Bunun ne yaptığını çözmek biraz zaman aldı: D

Ancak yukarıda vurgulandığı gibi, Math.floor () işe yarıyor ve bence daha okunabilir görünüyor.


3
Ayrıca 32 bite sığmazsa numaranızı sessizce öldürür. Krom konsolu: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

-1'i yarıya yuvarlamak ve bundan sonra aşağıdaki aşağı örnek gibi -1 ile çarpmanız gerekir.

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

Dürüst olmak gerekirse Bu toplulukta, yukarıda verilen @phoebus gibi cevapları tercih ediyoruz.
Ankit Pandey

0

İşte math.floor basit bir örnekte kullanılıyor. Bu, yeni bir geliştiricinin bir işlevde nasıl kullanılacağı ve ne işe yaradığı hakkında bir fikir edinmesine yardımcı olabilir. Umarım yardımcı olur!

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.