Преобразовать отрицательное число в положительное в JavaScript

308

Есть ли в JavaScript математическая функция, которая преобразует числа в положительные значения?

Дейв
источник

Ответы:

704

Вы могли бы использовать это ...

Math.abs(x)

Math​.abs()| MDN

ChrisNel52
источник
1
Вы можете даже рассмотреть ~ x + 1. Это довольно быстро, но не ясно, что он делает. Подчеркнул это, чтобы показать разницу: jsperf.com/absolute-int
omgaz
22
@omgaz Они не одинаковы ... var x = -100; ~x+1 === 100но var x = 100; ~x+1 === -100. Math.absвсегда делает его положительным, в то время как дополнение к ним просто инвертирует знак.
jduncanator
Вы можете даже подумать -x. Это довольно быстро!
Амара
93

Как насчет x *= -1? Мне нравится его простота.

gnclmorais
источник
17
Хотя это просто, оно предполагает, что число всегда будет отрицательным. Если сценарий использования такой, то это круто. В противном случае, я бы посоветовал осторожность.
myusuf
4
Я не согласен @myusuf. Любое число, которое xбудет перевернуто. Если x = 23и запихнуть в это уравнение, xтогда будет равно -23. По словам г-на Эскаланте: «Положительное время отрицательное равно отрицательному. Отрицательное время отрицательное равно положительному». ... "Как мне добраться до этих kiiiiiiids ?!"
ExcellentSP
2
Точно @Shane вчера. Если x=23, тогда это станет -23. Поскольку вопрос идет, 'Преобразуйте отрицательное число в положительное число в JS', но вышеупомянутое перевернет любое число, будь то положительное или отрицательное.
Myusuf
2
Понял. Моя интерпретация вашего комментария заключалась в том, чтобы изменить число и не xвсегда давать положительный результат. Мои извинения @myusuf.
ExcellentSP
1
Напомню, что это решение не относится к числам с плавающей запятой, оно получает только десятичную часть
Оскар Луза
46

Math.abs(x)или , если вы уверены , значение отрицательное перед преобразованием только предварять регулярный знак минус: x = -x.

orlp
источник
29

Знак минус (-) может преобразовывать положительные числа в отрицательные числа и отрицательные числа в положительные числа. x=-yэто визуальный сахар для x=(y*-1).

var y = -100;
var x =- y;
Шоссе Жизни
источник
12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

Я нахожу это решение легко понять.

MarkD
источник
8

Если вы хотите написать интересный код, который никто другой не сможет обновить, попробуйте это:

~ --x

рукав моря
источник
1
Это не будет работать с плавающей точкой, хотя ... и значение х тоже меняется.
Алексис Уилке
Я думаю, если вы не можете изменить х: ~ --x; ++ x
Кайл
1
Кайл, ~оператор конвертирует число в 32-битное целое число. Если в качестве входных данных у вас есть плавающее число, оно будет скрыто.
Алексис Уилке
7

Я знаю, что это немного поздно, но для людей, которые борются с этим, вы можете использовать следующие функции:

  • Превратить любое число положительным

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
    
  • Превратить любое число отрицательным

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
    
  • Инвертировать любое число

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54
    
Адель Имран
источник
6

Отрицательный к положительному

var X = -10 ;
var number = Math.abs(X);     //result 10

От положительного к отрицательному

var X = 10 ;
var number = (X)*(-1);       //result -10
Bashirpour
источник
Я вижу, что ты хочешь показать, но то, как ты это выразил, сбивает с толку. Возможно, вам следует указать: для положительного: использовать abs, для отрицательного: abs (x) * -1. Таким образом, вы не подразумеваете, что является прежним знаком X.
Дионис
5

Умножение на (-1) - самый быстрый способ преобразования отрицательного числа в положительное. Но вы должны быть осторожны, чтобы не преобразовать мою ошибку положительного числа в отрицательное! Так что дополнительная проверка необходима ...

Тогда Math.abs, Math.floor и parseInt самый медленный.

введите описание изображения здесь

https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1

скомбинировать
источник
1
Некоторые из нас забывают, насколько полезной может быть базовая математика в таких случаях. Спасибо, что напомнили мне о такой простоте.
Александр Диксон
2

Я сделал что-то подобное сам.

num<0?num*=-1:'';

Он проверяет, является ли число отрицательным, и если это так, умножьте на -1. Это вернет значение, оно зависит от вас, если вы его захватите. Если вы хотите назначить что-то, вы должны сделать что-то вроде:

var out = num<0?num*=-1:num; //I think someone already mentioned this variant.

Но это действительно зависит от вашей цели. Для меня это было просто, сделать его положительным, если отрицательным, иначе ничего не делать. Следовательно, '' в коде. В этом случае я использовал третичный оператор, потому что хотел, вполне может быть:

if(num<0)num*=-1;

Я видел побитовое решение здесь и хотел прокомментировать это тоже.

~--num; //Drawback for this is that num original value will be reduced by 1

На мой взгляд, эта мысль очень причудливая, мы могли бы переписать ее так:

~(num = num-1);

Проще говоря, мы берем отрицательное число, убираем одно из него и затем побитово инвертируем его Если бы мы поразрядно инвертировали его, мы бы получили значение 1 слишком маленьким. Вы также можете сделать это:

~num+1; //Wont change the actual num value, merely returns the new value

Это будет делать то же самое, но сначала будет инвертировать, а затем добавить 1 к положительному числу. Хотя вы не можете сделать это:

~num++; //Wont display the right value.

Это не будет работать по причине приоритета , постфиксные операторы, такие как num++будут оцениваться раньше ~, и причина префикса ++numне будет работать, даже если он имеет тот же приоритет, что и побитовый НЕ (~), потому что он оценивается справа налево. Я пытался поменять их местами, но кажется, что префикс немного привередливый по сравнению с побитовым НЕ. +1 будет работать, потому что «+» имеет более высокий приоритет и будет оцениваться позже.

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

Я надеюсь, что этот пост не отошел от первоначального вопроса. : /

Atspulgs
источник
2

Мой минимальный подход

Для преобразования отрицательного числа в положительное и наоборот

var num = -24;
num -= num*2;
console.log(num)
// result = 24

Мабве Исаак
источник
0

Вы можете использовать оператор ~, который логически преобразует число в отрицательное и добавляет 1 к отрицательному:

var x = 3;
x = (~x + 1);
console.log(x)
// result = -3

Mr.X
источник
0

Я знаю другой способ сделать это. Эта техника работает с негативного на позитивное и наоборот

var x = -24;
var result = x * -1;

Наоборот:

var x = 58;
var result = x * -1;

ЖИВОЙ КОД:

// NEGATIVE TO POSITIVE: ******************************************
var x = -24;
var result = x * -1;
console.log(result);

// VICE VERSA: ****************************************************
var x = 58;
var result = x * -1;
console.log(result);

// FLOATING POINTS: ***********************************************
var x = 42.8;
var result = x * -1;
console.log(result);

// FLOATING POINTS VICE VERSA: ************************************
var x = -76.8;
var result = x * -1;
console.log(result);

Tarryk Ttmm
источник
Это не отвечает на вопрос. Дейв просит функцию, которая меняет значение с отрицательного на положительное и с положительного на положительное .
RaphaMex
Его вопрос говорит: «Есть ли в JavaScript математическая функция, которая преобразует числа в положительные значения?» Он не упоминает позитив к позитиву. Он упоминает только отрицательное к положительному. Почему вы хотите преобразовать положительное в положительное? Значение будет таким же.
Tarryk Ttmm
Вы можете попросить разъяснения в комментарии ниже вопроса. Во всяком случае, есть принятый ответ, который является правильным. Вы можете прочитать его еще раз и увидеть, что есть встроенная функция, которая ... преобразует положительное в положительное.
RaphaMex
0

Для функционального программирования у Рамды есть хороший метод для этого. Тот же метод работает от положительного к отрицательному и наоборот.

https://ramdajs.com/docs/#negate

рацемической
источник
0

Если вы хотите, чтобы число всегда было положительным, независимо от того, что вы можете сделать это.

function toPositive(n){
    if(n < 0){
        n = n * -1;
    }
    return n;
}
var a = toPositive(2);  // 2
var b = toPositive(-2); // 2

Вы также можете попробовать это, но я не рекомендую это:

function makePositive(n){
    return Number((n*-n).toString().replace('-','')); 
}
var a = makePositive(2);  // 2
var b = makePositive(-2); // 2

Проблема в том, что вы можете изменить число на отрицательное, затем преобразовать в строку и удалить - из строки, а затем преобразовать обратно в int. Что, я думаю, потребует больше обработки, чем просто использование другой функции.

Я проверил это в php, и первая функция работает быстрее, но иногда JS делает некоторые безумные вещи, поэтому я не могу сказать наверняка.

Диллон Бернетт
источник
Во втором примере выводится мощность входного номера. n*-nдолжно быть n*-1. Я бы вообще удалил пример, поскольку преобразования типов и вызов метода очень неэффективны по сравнению с простотой первого примера. Даже причудливость JS не может здесь помочь
Gust van de Wal