Liczba dodatnia do liczby ujemnej w JavaScript?

103

Zasadniczo odwrotność abs. Jeżeli mam:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  slideNum = -slideNum
}
console.log(slideNum)

Bez względu na konsolę zawsze zwraca liczbę dodatnią. Jak to naprawić?

Jeśli zrobię:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  _selector.animate({
    left: (-slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
} else {
  _selector.animate({
    left: (slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
}

mimo to działa, ale nie jest to „SUCHE” i po prostu głupie mieć cały blok kodu TYLKO dla pliku -.

Oscar Godson
źródło
4
Jestem pewien, że istnieje do tego wtyczka jQuery.
Jakub Hampl,

Odpowiedzi:

193
Math.abs(num) => Always positive
-Math.abs(num) => Always negative

Zdajesz sobie jednak sprawę, że dla twojego kodu

if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum = -slideNum }
console.log(slideNum)

Jeśli znaleziony indeks to 3, a numer slajdu to 3,
to 3 <3-1 => fałsz,
więc numer slajdu pozostaje dodatni ?

Dla mnie wygląda to bardziej na błąd logiczny.

RichardTheKiwi
źródło
84

Odwrotność abs jest Math.abs(num) * -1.

Jakub Hampl
źródło
10
Krótszy:return -Math.abs(num);
sarunast
29

Podstawowa formuła odwracania pozytywów na negatywne lub negatywne na pozytywne:

i - (i * 2)
Blake
źródło
32
Co jest nie tak i * -1? Nie jestem też pewien, czy to odpowiada na rzeczywiste pytanie.
Andrew Barber
5
Jest zależne od architektury, ale 0 - mogę być szybszy
Ben Taliadoros
@AndrewBarber i * -1nie działa w aktualnej wersji przeglądarki Chrome. Użyj -Math.abs (1), ale nie jestem pewien, dlaczego to działa, mam nadzieję, że ktoś może wyjaśnić dlaczego.
Philip Rollins
@PhilipRollins i * -1będzie działać zawsze. Nie wiem, jak próbowałeś, może miałeś jakąś literówkę. Ale ... co jest złego w i = -izamiast i = i * -1(lub i *= -1) odwracaniu pozytywów na negatywne lub negatywnych na pozytywne?
Diego ZoracKy
@DiegoZoracKy też tak myślałem, ale nie dla wersji chrome, którą pracowałem i działało w firefoxie, więc literówka nie wchodzi w rachubę. Jestem teraz na Linuksie, ale możesz przetestować swoją teorię na Chrome. Należy pamiętać o automatycznych aktualizacjach Chrome, więc wszelkie poprawki błędów zostałyby już zastosowane, a wszelkie nowe błędy zostałyby wysłane do społeczności, co oznacza, że ​​mógł to być błąd, który trwał tylko kilka dni, a teraz jest naprawiony na zawsze.
Philip Rollins,
9

Aby uzyskać ujemną wersję liczby w JavaScript, zawsze możesz użyć ~operatora bitowego.

Na przykład, jeśli masz a = 1000i chcesz przekonwertować go na wartość ujemną, możesz wykonać następujące czynności:

a = ~a + 1;

Co by skutkowało aistnieniem -1000.

Benjamin Williams
źródło
Czy jest to szybsze niż pomnożenie przez minus 1?
ryandawkins
Nie jestem pewien, czy mam być szczery, coś, czemu musiałbyś się przyjrzeć.
Benjamin Williams
@RyanDawkins to nie będzie szybsze niż pomnożenie przez -1. Javascript nie ma natywnie operatorów logicznych, tak jak robi to C. Tak więc, aby wykonać operację boolowską, JS musi dokonać konwersji między typami pod maską.
spinlock
2
Dlaczego nie a = -a?
Diego ZoracKy
Bitowo nie neguje dokładnie liczby. ~1000jest -1001, nie -1000.
brentonstrine
7
var x = 100;
var negX = ( -x ); // => -100
tpayne84
źródło
1
Proszę dodać kilka wyjaśnień edytując swoją odpowiedź, unikaj odpowiedzi tylko kodem
GGO
1
@GGO ... nie jestem pewien, jak to już nie jest jasne, ale jestem pewien: dodając znak minus przed wartością, a następnie zawijając go w nawias, wartość jest oceniana ... wynikiem jest Negacja wartość.
tpayne84
6

Czy jesteś pewien, że kontrola trafia do ciała if? Jak w przypadku, gdy stan ifzawsze jest prawdziwy? Bo jeśli tak się nie stanie, ciało iftestamentu nigdy nie zostanie wykonane i slideNumpozostanie pozytywne. Zaryzykuję przypuszczenie, że prawdopodobnie to właśnie widzisz.

Jeśli spróbuję wykonać następujące czynności w Firebug, wydaje się, że działa:

>>> i = 5; console.log(i); i = -i; console.log(i);
5
-5

slideNum *= -1powinien również działać. Tak jak powinno Math.abs(slideNum) * -1.

Vivin Paliath
źródło
Właśnie to zrobiłem if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }i nadal otrzymuję wynik pozytywny w tym console.log?
Oscar Godson
@Oscar, to, co mówi Vivin, $this.find('.pdxslide-activeSlide').index() < slideNum-1jest zawsze fałszywe.
David Tang,
4

Jeśli nie masz ochoty używać Math.Abs ​​* -1, możesz skorzystać z prostego stwierdzenia if: P

if (x > 0) {
    x = -x;
}

Oczywiście możesz uczynić to taką funkcją

function makeNegative(number) {
    if (number > 0) {
        number = -number;
    }
}

makeNegative (-3) => -3 makeNegative (5) => -5

Mam nadzieję że to pomoże! Math.abs prawdopodobnie zadziała dla Ciebie, ale jeśli to nie jest tak mało

Ash Pettit
źródło
Przed udzieleniem odpowiedzi na pytanie należy również zastanowić się, kiedy zostało zadane. To pytanie ma już prawie 5 lat. Tak więc, jeśli technologia się nie zmieniła i nie ma teraz lepszej / bardziej odpowiedniej odpowiedzi, zazwyczaj oferowanie innej odpowiedzi nie przynosi wiele wartości dodanej.
Igor
1
Osobiście cały czas przeglądam stare pytania dotyczące przepełnienia stosu. Z pewnością nie będzie to zbyt pomocne dla profesjonalisty, ale być może początkujący docenią wskazówkę! To powiedziawszy, najłatwiej jest zrobić tak, jak powyżej -Math.Abs ​​(-3) Jak omówiono powyżej Math.Abs ​​zmienia dowolną wartość na dodatnią. Następnie przedrostek ujemny powoduje, że jest ujemny
Ash Pettit
Głosowano za. Osobiście doceniam tę odpowiedź i uznałam ją za cenną. Możesz się uczyć od każdego.
jeremysawesome
3
var i = 10;
i = i / -1;

Wynik: -10

var i = -10;
i = i / -1;

Wynik: 10

Jeśli podzielisz przez minus 1, zawsze zmieni to twoją liczbę w obie strony.

Jeff Price
źródło
3

Javascript ma do tego dedykowany operator: jednoargumentowa negacja .

TL; DR: To znak minus!

Aby zanegować liczbę, po prostu poprzedz ją -w możliwie najbardziej intuicyjny sposób. Nie musisz pisać funkcji, użyj Math.abs()pomnóż przez-1 lub używaj operatora bitowego.

Jednoargumentowa negacja działa na literałach liczbowych:

let a = 10;  // a is `10`
let b = -10; // b is `-10`

Działa również ze zmiennymi:

let x = 50;
x = -x;      // x is now `-50`

let y = -6;
y = -y;      // y is now `6`

Możesz nawet użyć go wiele razy, jeśli użyjesz operatora grupowania (znanego również jako nawiasy:

l = 10;       // l is `10`
m = -10;      // m is `-10`
n = -(10);    // n is `-10`
o = -(-(10)); // o is `10`
p = -(-10);   // p is `10` (double negative makes a positive)

Wszystkie powyższe działają również ze zmienną.

brentonstrine
źródło
2
num * -1

Zrobiłoby to za Ciebie.

Vibhor Dube
źródło
1

Użyj 0 - x

x jest liczbą, którą chcesz odwrócić

milesman34
źródło
3
po prostu -xwystarczy.
Antti Haapala
1
Tylko -x daje -0. To rozwiązanie jest lepsze, jeśli mogą być zera
chrismarx
1

Konwertuje ujemną tablicę na dodatnią lub odwrotnie

function negateOrPositive(arr) {
    arr.map(res => -res)
};
Flash Noob
źródło
0

W waniliowym javascript

if(number > 0)
  return -1*number;

Gdzie numer powyżej to liczba dodatnia, którą zamierzasz przeliczyć

Ten kod konwertuje tylko liczby dodatnie na liczby ujemne po prostu przez pomnożenie przez -1

perfo
źródło