Як я можу округлити номер у Javascript?


228

Як я можу округлити номер у JavaScript?

math.round() не працює, оскільки він округляє його до найближчого десяткового.

Я не впевнений, чи є кращий спосіб зробити це, крім розбиття його в десятковій точці, зберігаючи перший біт. Там має бути...


21
Круглий до нуля чи до негативної нескінченності?
Даніель Брюкнер

Відповіді:


422

Використання Math.floor()- це один із способів цього зробити.

Більше інформації: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor


2
Це також найповільніший метод; якщо вам потрібно виконати багато з них, використовуйте побітові | оператор (див. мою посаду).
geraldalewis

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() це НЕ повільніше , ніж при використанні | оператор. Дякую Джейсону S, що перевірив мою роботу.

Ось код, який я використовував для тестування:

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
??? Я щойно запустив jsdb (www.jsdb.org), який використовує Spidermonkey 1.7, і провів цикл, щоб підбити підсумкове значення x [i] на масиві 100000 чисел з плаваючою комою, спочатку з Math.floor (), то з долотом або як ви пропонуєте. Це пройшло приблизно в той же час, 125 мсек.
Джейсон S

4
Щойно повторивши тест із 500000 числами з плаваючою точкою, це зайняло приблизно той самий час, приблизно 625 мсек.
Джейсон S

5
Тому я не бачу, як 1,25usec дуже повільно.
Джейсон S

3
Не можу посперечатися з вашими даними :) Я думаю, що, можливо, я переплутав реалізацію JS з ActionScript (побудований на EcmaScript; явно реалізація відрізняється). Дякуємо, що перевірили мою роботу!
geraldalewis

14
Вони теж не роблять те ж саме. |перетворюється на 32-бітове ціле число, обрізання; Math.floorкругляє вниз. jsfiddle.net/minitech/UVG2w
Рибаковим

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

Я думаю, що для такого вкладиша не потрібна функція.
Hubert Grzeskowiak

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)

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

Сьогодні обмінювався хтось з кодом elses і виявив таке, що, здається, також закручується вниз:

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

Для отримання додаткової інформації про глухонімих поширюються зсуву вправо (>>) см MDN Бітові оператори

Мені знадобилося певний час, щоб розібратися, що це робив: D

Але, як зазначено вище, Math.floor () працює і на мій погляд виглядає більш читабельним.


3
Він також мовчки вбиває ваш номер, якщо він не вміщується в 32 біти. Хромна консоль: 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

Ось математика використовується на простому прикладі. Це може допомогти новому розробнику зрозуміти, як його використовувати у функції та що вона робить. Сподіваюся, це допомагає!

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.