Как получить абсолютное значение целого числа без использования Math.abs?

Как получить абсолютное значение числа без использования math.abs?

Это то, что у меня есть до сих пор:

function absVal(integer) {
    var abs = integer * integer;
    return abs^2;
}

person chaneyz    schedule 15.05.2015    source источник
comment
Что вы имеете в виду под abs^2? Я думаю, вы хотели разделить, не так ли? (return abs/2)   -  person Alexis Wilke    schedule 11.07.2020


Ответы (5)


Вы можете использовать условный оператор и унарный оператор отрицания :

function absVal(integer) {
  return integer < 0 ? -integer : integer;
}
person Guffa    schedule 15.05.2015

Вы также можете использовать >> (Sign-propagating right shift).

function absVal(integer) {
    return (integer ^ (integer >> 31)) - (integer >> 31);;
}

Примечание: это будет работать только с целым числом

person Satpal    schedule 15.05.2015

Поскольку абсолютное значение числа — это «насколько далеко число от нуля», отрицательное число можно просто «перевернуть» на положительное (если вы извините мое отсутствие математической терминологии =P):

var abs = (integer < 0) ? (integer * -1) : integer;

В качестве альтернативы, хотя я не проверял это, может быть быстрее вычесть из нуля вместо умножения (т.е. 0 - integer).

person newfurniturey    schedule 15.05.2015
comment
Я был бы шокирован, если бы вычитание из 0 выполнялось медленнее, чем оператор if. - person taylorc93; 16.05.2015
comment
@ taylorc93 Нет, нет - не вместо всего троичного оператора, вместо части (integer * -1) ... Я, наверное, должен был написать это полностью = P - person newfurniturey; 16.05.2015
comment
Аааа, теперь это имеет больше смысла. Да, это стоило бы протестировать, но если этот код не запускается в программе миллионы раз, я не думаю, что это будет иметь большое значение. - person taylorc93; 16.05.2015

Проверьте, меньше ли число нуля! Если это так, умножьте его на -1;

person user4655509    schedule 15.05.2015

Нет причин, по которым мы не можем заимствовать реализация Java.

    function myabs(a) {
      return (a <= 0.0) ? 0.0 - a : a;
    }

    console.log(myabs(-9));

Как это работает:

  • if the given number is less than or zero
    • subtract the number from 0, which the result will always be > 0
  • иначе верните число (потому что это > 0)
person jdphenix    schedule 15.05.2015
comment
Это не очень хорошее решение: эта функция выполняет вычитание, если a равно нулю, но 0,0-0,0 уже равно 0,0, поэтому (a <0.0) лучше. Во-вторых, нет необходимости в вычитании, потому что есть унарный оператор отрицания. - person Paebbels; 16.05.2015
comment
Спасибо за ваш отзыв. Моя главная мысль заключалась в том, что если у вас есть хорошо решенная проблема, которую нужно реализовать, посмотрите на другие известные рабочие решения и используйте их. - person jdphenix; 16.05.2015
comment
Это хороший момент, но путь Java кажется не лучшим :) - person Paebbels; 16.05.2015