Jak zaokrąglić liczbę w JavaScript?

159

Chcę użyć JavaScript, aby zaokrąglić liczbę w górę. Ponieważ liczba jest walutą, chcę ją zaokrąglić w górę, jak w tych przykładach (2 miejsca po przecinku):

  • 192,168 => 192,20
  • 192,11 => 192,20
  • 192,21 => 192,30
  • 192,26 => 192,30
  • 192,20 => 192,20

Jak to osiągnąć za pomocą Javascript? Wbudowana funkcja JavaScript zaokrągla liczbę w oparciu o standardową logikę (mniej i więcej niż 5, aby zaokrąglić w górę).

cyberfly
źródło

Odpowiedzi:

313
/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=> 192.2
Andrew Marshall
źródło
2
@AndrewMarshall, jaki jest cel mnożenia, a następnie dzielenia przez 10?
codecowboy,
6
@codecowboy Jeśli tego nie zrobisz, ceil()otrzymasz od nas 193, więc musimy upewnić się, że cała precyzja, którą chcemy zachować, jest przed przecinkiem. Następnie wykonujemy operację odwrotną, aby przywrócić „oryginalną” wartość.
Andrew Marshall,
1
Jeśli dostaniesz taki numer 192.19999999999997, możesz zgłosić .toFixed(1)się donum
flamer.ohr
4
A dla tych, którzy zastanawiają się, jak zaokrąglić w górę do najbliższej CAŁKOWITEJ liczby, wystarczy Math.ceil (). Reszta to tylko ułamki dziesiętne. Aby zaoszczędzić innym czas, jaki zajęło mojemu mózgowi dotarcie do tego!
Nigel B. Peck
To rozwiązanie ma błąd: Math.ceil (0,0159 * 1000000000) / precyzja. Otrzymasz ułamek 0,015900001. Należy dodać weryfikację zakresu w celu uzyskania dokładności.
Frank
26

Trochę późno, ale może w tym celu utworzyć funkcję javascript wielokrotnego użytku:

// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

Wywołaj funkcję jako

alert(roundNumber(192.168,2));
suryakiran
źródło
2
Działa to świetnie, ale OP zapytał, jak zaokrąglić liczbę w górę, więc zamiast Math.round należy użyć Math.ceil.
kloddant
Ta odpowiedź jest lepsza niż zaakceptowana odpowiedź, jeśli chcesz poprawnie zaokrąglić w górę, niezależnie od tego, do którego miejsca dziesiętnego dążysz. Np .: 1,054 -> 1,05 1,055 -> 1,06 JEDNAK tutaj jest przypadek skrajny: 1,005 -> 1 1,006 -> 1,01 I 1,015 -> 1,01 1,016 -> 1,02 Więc bądź ostrożny.
Jay K
21

Normalne zaokrąglanie będzie działać z niewielkimi zmianami:

Math.round(price * 10)/10

a jeśli chcesz zachować format waluty, możesz użyć metody liczbowej .toFixed()

(Math.round(price * 10)/10).toFixed(2)

Chociaż to sprawi, że będzie to String =)

Aloza
źródło
Math.round (192,11 * 100) / 100 ->
192,11
1
Drugi nie wymaga zaokrąglania, bardziej przypominaprice.toFixed(2)
Michael Krelin - haker
@Krtek ooops, Dzięki, że to złapałeś. Źle przeczytałem pytanie. Zaktualizowano odpowiedź.
Shad
2
OP zapytał, jak zaokrąglić liczbę, więc zamiast Math.round należy użyć Math.ceil.
kloddant
10

Bardzo blisko odpowiedzi TheEye , ale zmieniam małą rzecz, aby działała:

var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );

Hoàng Long
źródło
2

OP oczekuje dwóch rzeczy:
A. zaokrąglić w górę do wyższych dziesiątych i
B. pokazać zero na miejscu setnym (typowa potrzeba w przypadku waluty).

Wydaje się, że spełnienie obu wymagań wymagałoby oddzielnej metody dla każdego z powyższych. Oto podejście, które opiera się na sugerowanej odpowiedzi Suryakirana:

//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60

Ważna uwaga: to rozwiązanie daje zupełnie inny wynik z liczbami ujemnymi i wykładniczymi.

Aby porównać tę odpowiedź z dwoma bardzo podobnymi, zobacz następujące 2 podejścia. Pierwsza po prostu zaokrągla normalnie do najbliższej setnej, a druga po prostu zaokrągla w górę do najbliższej setnej (większej).

function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92
Kay V
źródło
2

ok, odpowiedź została udzielona, ​​ale pomyślałem, że chciałbyś zobaczyć moją odpowiedź, która raz wywołuje funkcję math.pow (). Myślę, że lubię utrzymywać rzeczy SUCHE.

function roundIt(num, precision) {
    var rounder = Math.pow(10, precision);
    return (Math.round(num * rounder) / rounder).toFixed(precision)
};

To wszystko składa się na całość. Zastąp Math.round () przez Math.ceil (), aby zaokrąglić w górę zamiast zaokrąglać, czego chciał OP.

John Grabauskas
źródło
1

ta funkcja ogranicza liczbę dziesiętną bez okrągłej liczby

function limitDecimal(num,decimal){
     return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}
Behnam Mohammadi
źródło
Jako krótsza alternatywa: return ('' + num) .split ('.'). Shift ()
Roberto
dzięki Roberto ten kod działa, ale usuń wszystkie dziesiętne
Behnam Mohammadi
0

Używam odpowiedzi @AndrewMarshall przez długi czas, ale znalazłem kilka skrajnych przypadków. Następujące testy nie przechodzą:

equals(roundUp(9.69545, 4), 9.6955);
equals(roundUp(37.760000000000005, 4), 37.76);
equals(roundUp(5.83333333, 4), 5.8333);

Oto, czego teraz używam, aby zaokrąglenie zachowywało się poprawnie:

// Closure
(function() {
  /**
   * Decimal adjustment of a number.
   *
   * @param {String}  type  The type of adjustment.
   * @param {Number}  value The number.
   * @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).
   * @returns {Number} The adjusted value.
   */
  function decimalAdjust(type, value, exp) {
    // If the exp is undefined or zero...
    if (typeof exp === 'undefined' || +exp === 0) {
      return Math[type](value);
    }
    value = +value;
    exp = +exp;
    // If the value is not a number or the exp is not an integer...
    if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
      return NaN;
    }
    // If the value is negative...
    if (value < 0) {
      return -decimalAdjust(type, -value, exp);
    }
    // Shift
    value = value.toString().split('e');
    value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));
    // Shift back
    value = value.toString().split('e');
    return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
  }

  // Decimal round
  if (!Math.round10) {
    Math.round10 = function(value, exp) {
      return decimalAdjust('round', value, exp);
    };
  }
  // Decimal floor
  if (!Math.floor10) {
    Math.floor10 = function(value, exp) {
      return decimalAdjust('floor', value, exp);
    };
  }
  // Decimal ceil
  if (!Math.ceil10) {
    Math.ceil10 = function(value, exp) {
      return decimalAdjust('ceil', value, exp);
    };
  }
})();

// Round
Math.round10(55.55, -1);   // 55.6
Math.round10(55.549, -1);  // 55.5
Math.round10(55, 1);       // 60
Math.round10(54.9, 1);     // 50
Math.round10(-55.55, -1);  // -55.5
Math.round10(-55.551, -1); // -55.6
Math.round10(-55, 1);      // -50
Math.round10(-55.1, 1);    // -60
Math.round10(1.005, -2);   // 1.01 -- compare this with Math.round(1.005*100)/100 above
Math.round10(-1.005, -2);  // -1.01
// Floor
Math.floor10(55.59, -1);   // 55.5
Math.floor10(59, 1);       // 50
Math.floor10(-55.51, -1);  // -55.6
Math.floor10(-51, 1);      // -60
// Ceil
Math.ceil10(55.51, -1);    // 55.6
Math.ceil10(51, 1);        // 60
Math.ceil10(-55.59, -1);   // -55.5
Math.ceil10(-59, 1);       // -50

Źródło: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round

Nicolas BADIA
źródło
1
Twoje przypadki testowe wydają się nieprawidłowe. roundUp(37.760000000000005, 4)powinno być 37.7601i roundUp(5.83333333, 4)powinno być 5.8334. Te dwa (i twoje pierwsze) wszystkie odnoszą się do podanego przeze mnie fn.
Andrew Marshall
@AndrewMarshall ma powód, twoje oczekiwane wartości są nieprawidłowe dla przypadku 2 i 3.
Amn
-3

parseInt zawsze zaokrągla w dół, więc .....

console.log(parseInt(5.8)+1);

do parseInt () + 1

Omar
źródło