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.