Konwertuj liczbę ujemną na dodatnią w JavaScript

308

Czy w JavaScript jest funkcja matematyczna, która konwertuje liczby na wartości dodatnie?

Dave
źródło

Odpowiedzi:

703

Możesz użyć tego ...

Math.abs(x)

Math​.abs()| MDN

ChrisNel52
źródło
1
Możesz nawet rozważyć ~ x + 1. Jest dość szybki, ale nie jest jasne, co robi. Wymyślono to, aby pokazać różnicę: jsperf.com/absolute-int
omgaz
22
@omgaz Nie są tacy sami ... var x = -100; ~x+1 === 100ale var x = 100; ~x+1 === -100. Math.abszawsze czyni to pozytywnym, a przyjmowanie uzupełnienia po prostu odwraca znak.
jduncanator,
Możesz nawet rozważyć -x. To dość szybkie!
amara
93

Co x *= -1? Podoba mi się jego prostota.

gnclmorais
źródło
17
Chociaż jest to proste, zakłada się, że liczba będzie zawsze ujemna. Jeśli przypadek użycia jest taki, to jest niesamowity. W przeciwnym razie radziłbym ostrożność.
myusuf
4
Nie zgadzam się @myusuf. Każda liczba, która xzostanie odrzucona. Jeśli x = 23i zostanie wbity w to równanie, xwówczas będzie równy -23. Według słów pana Escalante: „Dodatni razy ujemny równa się ujemnemu. Negatywny razy ujemny równa się dodatniej”. ... „Jak dotrzeć do tych kiiiiiiidów ?!”
Doskonały
2
Dokładnie @Shane wczoraj. Jeśli x=23, to stanie się -23. W miarę zadawania pytania „Konwertuj liczbę ujemną na liczbę dodatnią w JS”, ​​ale powyższe spowoduje odwrócenie dowolnej liczby, czy to dodatniej, czy ujemnej.
myusuf,
2
Zrozumiany. Moja interpretacja twojego komentarza była w kontekście przerzucania numeru i nie robienia xzawsze pozytywnych. Moje przeprosiny @myusuf.
Doskonały
1
tylko przypomnij, że to rozwiązanie nie dotyczy liczb zmiennoprzecinkowych, dostaje tylko część dziesiętną
Oscar Luza
46

Math.abs(x)lub jeśli jesteś pewna wartość jest ujemna przed konwersją prostu poprzedź regularny znak minus: x = -x.

orlp
źródło
29

Znak minus (-) może konwertować liczby dodatnie na liczby ujemne, a liczby ujemne na liczby dodatnie. x=-yjest wizualnym cukrem dla x=(y*-1).

var y = -100;
var x =- y;
Autostrada życia
źródło
15
unsigned_value = Math.abs(signed_value);
Marc B.
źródło
12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

Uważam to rozwiązanie za łatwe do zrozumienia.

MarkD
źródło
8

Jeśli chcesz napisać interesujący kod, którego nikt inny nie może zaktualizować, spróbuj tego:

~ --x

Kyle
źródło
1
Nie działa to jednak z zmiennoprzecinkowymi ... i zmienia się również wartość x.
Alexis Wilke
Chyba nie możesz zmienić x: ~ --x; ++ x
Kyle
1
Kyle, ~operator konwertuje liczbę na 32-bitową liczbę całkowitą. Jeśli masz liczbę zmiennoprzecinkową jako dane wejściowe, zostanie ona zablokowana.
Alexis Wilke
7

Wiem, że to trochę za późno, ale dla osób mających z tym problem, możesz użyć następujących funkcji:

  • Włącz dowolną liczbę dodatnią

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
  • Włącz dowolną liczbę ujemną

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
  • Odwróć dowolną liczbę

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54
Adeel Imran
źródło
6

Negatywny na pozytywny

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

Pozytywne na negatywne

var X = 10 ;
var number = (X)*(-1);       //result -10
Bashirpour
źródło
Widzę, co chcesz pokazać, ale sposób, w jaki to ujmujesz, jest mylący. Może powinieneś powiedzieć: na pozytywne: użyj abs, na negatywne: abs (x) * -1. W ten sposób nie sugerujesz, jaki jest poprzedni znak X.
Dionys
5

Mnożenie przez (-1) to najszybszy sposób na konwersję liczby ujemnej na dodatnią. Ale musisz uważać, aby nie zamienić mojej pomyłki na liczbę dodatnią na ujemną! Potrzebna jest więc dodatkowa kontrola ...

Następnie Math.abs, Math.floor i parseInt są najwolniejsze.

wprowadź opis zdjęcia tutaj

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

Połączyć
źródło
1
Niektórzy z nas zapominają, jak przydatna może być podstawowa matematyka w takich przypadkach. Dzięki za przypomnienie mi o takiej prostocie.
Alexander Dixon,
2

Zrobiłem coś takiego sam.

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

Sprawdza, czy liczba jest ujemna, a jeśli tak, pomnóż ją przez -1. Zwraca wartość, która zależy od ciebie, jeśli ją uchwycisz. Jeśli chcesz coś do tego przypisać, prawdopodobnie powinieneś zrobić coś takiego:

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

Ale to naprawdę zależy od tego, jaki jest twój cel. Dla mnie było to proste, zrób to pozytywnie, jeśli negatywne, w przeciwnym razie nic nie rób. Stąd „” w kodzie. W tym przypadku użyłem trzeciego operatora, ponieważ chciałem, może to być:

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

Widziałem tutaj rozwiązanie bitowe i też chciałem je skomentować.

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

Moim zdaniem ta dusza jest bardzo fantazyjna, moglibyśmy ją przepisać w następujący sposób:

~(num = num-1);

Mówiąc najprościej, bierzemy liczbę ujemną, odejmujemy ją, a następnie odwracamy bitowo. Gdybyśmy odwrócili bitowo normalnie, otrzymalibyśmy wartość 1 za małą. Możesz także to zrobić:

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

To zrobi to samo, ale najpierw odwróci, a następnie doda 1 do liczby dodatniej. Chociaż NIE MOŻESZ tego zrobić:

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

To nie zadziała z powodu pierwszeństwa , operatory postfiksów, takie jak num++byłyby oceniane przed ~, a prefiks przyczyny ++numnie działałby, nawet jeśli ma taki sam priorytet jak bitowe NOT (~), ponieważ jest oceniany od prawej do lewej. Próbowałem je zamienić, ale wygląda na to, że prefiks jest nieco wybredny w porównaniu do bitowego NIE. +1 będzie działać, ponieważ „+” ma wyższy priorytet i zostanie oceniony później.

Uznałem, że to rozwiązanie jest raczej zabawne, i postanowiłem je rozwinąć, ponieważ zostało tam wrzucone i ludzie, którzy na niego patrzą, prawdopodobnie go ignorują. Chociaż tak, nie będzie działać z pływakami.

Mam nadzieję, że ten post nie odszedł od pierwotnego pytania. : /

Atspulgs
źródło
2

Moje minimalne podejście

Do konwersji liczby ujemnej na dodatnią i odwrotnie

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

Mabwe Izaak
źródło
0

Możesz użyć operatora ~ , który logicznie konwertuje liczbę na ujemną i dodaje 1 do ujemnej:

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

Mr.X
źródło
0

Znam inny sposób na zrobienie tego. Ta technika działa negatywnie na pozytywną i odwrotnie

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

Nawzajem:

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

KOD NA ŻYWO:

// 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
źródło
To nie odpowiada na pytanie. dave prosi o funkcję, która zmienia wartość ujemną na dodatnią i dodatnią na dodatnią .
RaphaMex
Jego pytanie brzmi: „Czy w JavaScript jest funkcja matematyczna, która konwertuje liczby na wartości dodatnie?” Nie wspomina pozytywnie na pozytywnie. Wspomina tylko negatywne na pozytywne. Dlaczego chcesz przekonwertować pozytywne na pozytywne. Wartość byłaby taka sama.
Tarryk Ttmm
Możesz poprosić o wyjaśnienie w komentarzu pod pytaniem. W każdym razie istnieje poprawna odpowiedź. Możesz przeczytać go jeszcze raz i zobaczyć, że jest wbudowana funkcja, która ... konwertuje pozytywne na pozytywne.
RaphaMex
0

Jeśli chcesz, aby liczba zawsze była dodatnia, bez względu na to, co możesz to zrobić.

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

Możesz także spróbować tego, ale nie polecam tego:

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

Problem polega na tym, że możesz zmienić liczbę na ujemną, a następnie przekonwertować na ciąg i usunąć - z ciągu, a następnie przekonwertować z powrotem na int. Sądzę, że zajęłoby to więcej przetwarzania niż użycie innej funkcji.

Przetestowałem to w php i pierwsza funkcja jest szybsza, ale czasami JS robi jakieś szalone rzeczy, więc nie mogę być tego pewien.

Dillon Burnett
źródło
Drugi przykład podaje moc liczby wejściowej. n*-npowinno być n*-1. Jednak całkowicie usunę ten przykład, ponieważ konwersje typów i wywołania metod są bardzo nieefektywne w porównaniu z prostotą pierwszego przykładu. Nawet dziwactwo JS nie może tu pomóc
Gust van de Wal