Как поделить число нацело в javascript?

441
02 мая 2017, 07:10
  1. Как в javascript поделить число нацело?
  2. Есть ли какой-то оператор для деления нацело?
Answer 1

Поделить на число без остатка в JS можно несколькоми способами.

Способ 1. Округление:

var x = 10, y = 3.3333;
alert(Math.floor(x/y));

Этот способ расчитан на результат вычисления больше нуля. Если результат будет отрицательный, то такая конструкция сработает не правильно.

Например :

Math.floor(-100/3); // Выдаст -34, хотя целая часть от -33,33333336 будет равна -33

Как вариант, для решения этой задачи округлением можно использовать опертор if:

if(x/y>=0)
   alert(Math.floor(x/y));
else
   alert(Math.ceil(x/y));

Способ 2 : Вероятно не такой быстрый как предыдущий, но более универсальный. Приведение к int:

var x = 10, y = 3.3333;
alert(parseInt(x/y));

Способ 3. Производительный и универсальный:

var x = 10, y = 3.3333;
function div(val, by){
    return (val - val % by) / by;
}
alert(div(x, y));

Ну и немного хадкора:

alert(~~(x/y)) // сокращенный Math.floor() результаты будут такие же
alert(x/y>>0)       
alert(x/y|0) 

демо на jsfiddle

Answer 2

В javascript отсутствует деление на целые числа и числа с плавающей запятой.
Возможно, как следствие, отсутствуют и специальные арифметические операторы для целый чисел.

Исходя из этого есть несколько вариантов решения:

  1. Выполнение обычного деления и взятие от результата целой части. Для этой процедуры есть функции Math.floor и Math.ceil, разница заключается в том, большее целое или меньшее будет выбрано.

    console.log(Math.floor(10 / 3)); 
    console.log(Math.floor(-10 / 3)); 
     
    console.log(Math.ceil(10 / 3)); 
    console.log(Math.ceil(-10 / 3)); 
     
     

    Как видно из примера, для положительных чисел подходит floor, для отрицательных ceil

  2. Использование битовых операций. На уровне спецификации, указано, что битовые операции работают только с 32х битными целыми числами, поэтому при работе с ними стоит быть осторожным: при применении их к большим числа, старшие биты числа будут обрезаны. При этом это позволяет быстро брать целую часть, за счет приведения аргумента к целому числу перед выполнением битовой операции.
    Широко распространенным приемом является применение побитового или с 0, что оставляет все биты исходного числа неизменными. А также побитовый сдвиг, так же на 0 разрядов

    console.log((10 / 3) | 0); 
    console.log((-10 / 3) | 0); 
     
    console.log((10 / 3) >> 0); 
    console.log((-10 / 3) >> 0); 
     
    console.log(' Неожиданно: ', (10000000000 / 2) | 0) 
    console.log(' Неожиданно: ', (10000000000 / 2) >> 0) 
     
     

Answer 3
  1. Как вариант деления использовать вот такую конструкцию

    function divme(a, b){
        return (a - a%b)/b
    }
    
  2. нет

UPD: встречал ещё вариант деления. Возможно будет вам полезна. Ссылка

Answer 4

Вот ещё вариант:

Math.floor(a / b);

И вот такой, но с ним лучше быть осторожнее — работает лишь для небольших чисел (где-то до 4e9):

a / b | 0
Answer 5

Всё зависит от того, как вы хотите округлить результат деления.

Math.floor(a/b); 
Math.floor(3/2); // = 1

Link

Math.ceil(a/b);
Math.ceil(3/2); // = 2;

Link

READ ALSO
объявление функции javascript

объявление функции javascript

Стажируюсь в компании на фронтенд-разработчика, пришел с строготипизированной джавы, и некоторые моменты мне не очевидны, а именно:

324
Запрет скролла над картами google

Запрет скролла над картами google

Я видел подобные вопросы на этом ресурсе и на оригинальном и у меня все-равно проблема

300
html checkbox values to array and ajax

html checkbox values to array and ajax

здравствуйте, есть несколько чекбоксов, как показано на скриншоте

314
Записать в БД несколько строк сразу

Записать в БД несколько строк сразу

СУБД: MySQL 55, сервер: Apache 24, PHP 7, пробую сделать без фреймворков

209