Как я могу округлить число в Javascript?

228

Как я могу округлить число в JavaScript?

math.round() не работает, потому что округляет его до ближайшего десятичного числа.

Я не уверен, есть ли лучший способ сделать это, кроме разрыва его на десятичную точку при сохранении первого бита. Должно быть...

Бен Шелок
источник
21
Округление к нулю или к отрицательной бесконечности?
Даниэль Брюкнер

Ответы:

422

Использование Math.floor()это один из способов сделать это.

Дополнительная информация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

Феб
источник
2
Это также самый медленный метод; если вам нужно выполнить много из них, используйте побитовую | оператор (см. мой пост).
Джеральдалвис
12
| Оператор также округляет к нулю, а не к отрицательной бесконечности.
Майк Годин
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-скрипте это имеет ОГРОМНОЕ отличие. В противном случае я бы проголосовал здесь.
Джордж,
Я обновил ответ, чтобы заглавные буквы были правильными.
Chasen
18
@ Джордж ОГРОМНЫЙ или огромный? : D
m93a
1
Вы можете получить тот же эффект, что и при округлении до нуля x | 0.
Ахмед Фасих
28

Math.floor()будет работать, но это очень медленно по сравнению с использованием побитовой ORоперации:

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

EDIT Math.floor() это не медленнее , чем при использовании | оператор. Спасибо Джейсону С. за проверку моей работы.

Вот код, который я использовал для тестирования:

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
источник
11
??? Я только что запустил jsdb (www.jsdb.org), который использует Spidermonkey 1.7, и запустил цикл для суммирования значения пола x [i] в ​​массиве из 100000 чисел с плавающей запятой, сначала с помощью Math.floor (), затем с побитовой или как вы предлагаете. Это заняло примерно столько же времени, 125 мсек.
Джейсон С.
4
Просто повторили тест с 500000 числами с плавающей запятой, это заняло примерно то же время, около 625 мсек.
Джейсон С.
5
Так что я не вижу, как 1.25usec очень медленно.
Джейсон С.
3
Не могу поспорить с вашими данными :) Я думаю, что, возможно, я перепутал реализацию JS с ActionScript (построен на EcmaScript; очевидно, реализация отличается). Спасибо за проверку моей работы!
Geraldalewis
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
Петр Хуртак
источник
Я думаю, что такая строка не требует функции.
Юбер Гжесковяк,
4
roundDown (4.56, 2) дает вам 4,55, так что я не думаю, что это хорошее решение.
крик
6

Чтобы округлить до отрицательной бесконечности, используйте:

rounded=Math.floor(number);

Чтобы округлить до нуля (если число может округляться до 32-разрядного целого числа от -2147483648 до 2147483647), используйте:

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)
DigitalRoss
источник
1 + 7/8 = 1 - Там нет особой необходимости в Math.floor () :)
Джейсон Берри
18
На самом деле это (7/8) +1, а не 1. Спасибо алгебре 3-го класса
Джо Филлипс
1
Хм, пожалуйста, на самом деле попробуйте это в программе JavaScript. Я сделал. Отобразите (1 + 7/8), и вы увидите 1,875. Math.round (...) - 2, Math.floor (...) - 1. О чем вы, ребята, говорите?
DigitalRoss
1
Или откройте консоль ошибок Firefox. Или Firebug. Это не сложно попробовать. Я попробовал это. 1 + 7/8 - 1,875 в js. Возможно, вы забыли, что вся математика в 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
Матиас Урлич
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, приведенные выше.
Анкит Пандей
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>
Индранатха Мадугалле
источник