2009-09-16 17 views
189

Jak zaokrąglić liczbę w JavaScript?Jak zaokrąglić liczbę w JavaScript?

math.round() nie działa, ponieważ zaokrągla go do najbliższego miejsca po przecinku.

Nie jestem pewien, czy jest lepszy sposób robienia tego poza rozbijaniem go na separator dziesiętny przy zachowaniu pierwszego. Musi być ...

+19

Okrągłe w kierunku zera lub w kierunku ujemnej nieskończoności? –

Odpowiedz

363
Math.floor() 

jest odpowiedzią.

+2

Jest to również najwolniejsza metoda; jeśli potrzebujesz wykonać wiele z nich, użyj bitowego | operator (patrz mój post). – geraldalewis

+6

The | operator nie będzie działał na liczbach większych niż 2147483647. –

+10

The | operator również zaokrągla w kierunku zera, a nie ujemnej nieskończoności. –

3
Math.floor(1+7/8) 
+0

1 + 7/8 = 1 - Niewiele potrzeba Math.floor() tam :) –

+16

Właściwie to (7/8) +1, które nie jest 1. Dziękuję 3 klasie algebra –

+1

Umm, proszę faktycznie próbować to w program javascript. Zrobiłem. Wyświetlacz (1 + 7/8), a zobaczysz 1.875. Math.round (...) to 2, Math.floor (...) to 1. O czym ty mówisz? – DigitalRoss

18

Math.floor() będzie działać, ale to jest bardzo powolny w porównaniu do korzystania bitowym OR operacji:

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

EDITMath.floor() jest nie wolniej niż przy użyciu | operator. Dziękuję Jasonowi Sowi za sprawdzenie mojej pracy.

Oto kod użyłem do testu:

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); 
+7

??? Po prostu uruchomiłem jsdb (www.jsdb.org), który używa Spidermonkey 1.7, i uruchomiłem pętlę, aby podsumować wartość podłogi x [i] na tablicy 100000 liczb zmiennoprzecinkowych, najpierw z Math.floor(), następnie z bitwise lub jak sugerujesz. Trwało to mniej więcej w tym samym czasie, 125 milisekund. –

+2

Po prostu powtórzyłem test z 500000 liczb zmiennoprzecinkowych, trwało to mniej więcej tyle samo czasu, około 625 ms. –

+4

Więc nie widzę, jak 1.25usec jest bardzo powolny. –

55

Okrągłego do minus nieskończoności - Math.floor()

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

Okrągły do ​​zera - zazwyczaj o nazwie Truncate(), ale nie obsługiwanym przez JavaScript - mogą być emulowane przez przy użyciu liczb Math.ceil() dla liczb ujemnych i Math.floor() dla liczb dodatnich.

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

Dziękuję za kompletność, ale wielkość liter jest nieprawidłowa ... oraz w skrypcie java, który powoduje OGROMNĄ różnicę. W przeciwnym razie przegłosowałbym tutaj. – George

+0

Zaktualizowałem odpowiedź, tak aby wielkość liter była teraz poprawna. – chasen

+15

@George OGROMNY czy ogromny? : D – m93a

2

Czy błahy okrągły z kimś kodu elses dzisiaj i okazało się, że po których wydaje rund w dół, a także:

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

Aby uzyskać więcej informacji na prawym przesunięcia logowania rozmnożeniowego (>>) zobaczyć MDN Bitwise Operators

zajęło mi trochę czasu, aby się zorientować, co to robi: D

Ale jak podkreślono powyżej, Math.floor() działa i wygląda bardziej czytelny moim zdaniem.

+1

To również po cichu zabija twój numer, jeśli nie mieści się w 32 bitach. Konsola Chromium: 99999999999999999999999 | 0 => -167772160 –

16

Można spróbować użyć tej funkcji, jeśli trzeba zaokrąglić w dół do określonej liczby miejsc po przecinku

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

przykłady

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

Myślę, że taki liniowiec nie wymaga funkcji. –

+0

roundDown (4.56, 2) daje 4.55, więc nie sądzę, że to dobre rozwiązanie. – cryss

6

Aby zaokrąglić w dół do minus nieskończoności, użytkowania:

rounded=Math.floor(number); 

na zakończenie w dół do zera (gdy ilość można zaokrąglić do 32-bitową liczbę całkowitą tów pl -2147483648 do 2147483647), użyj:

rounded=number|0; 

Aby zaokrąglić w dół do zera (dla dowolnej liczby), przeznaczenie:

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

zaokrąglania number kierunku 0 Można to zrobić poprzez odjęcie jej podpisaną część ułamkową number % 1:

rounded = number - number % 1; 

Jak Math.floor (rundy kierunku -Infinity) metoda ta jest całkowicie dokładne.

Istnieją różnice w obsłudze -0, +Infinity i -Infinity jednak:

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

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

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

trzeba umieścić -1 do okrągłego połowy w dół, a potem pomnożyć przez -1 jak np dół poniżej.

<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> 
Powiązane problemy