Konwertuj liczbę ujemną na dodatnią w JavaScript


308

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

Odpowiedzi:


703

Możesz użyć tego ...

Math.abs(x)

Math​.abs()| MDN


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.


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.


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;


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.


8

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

~ --x


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

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

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


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. : /


2

Moje minimalne podejście

Do konwersji liczby ujemnej na dodatnią i odwrotnie

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


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


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);


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.