Yanıtlar:
var x = -100; ~x+1 === 100
ama var x = 100; ~x+1 === -100
. Math.abs
her zaman olumlu yapar, tamamlayıcıları almak ise sadece işareti tersine çevirir.
Ne olmuş x *= -1
? Basitliğini seviyorum.
x
çevrilecek. Eğer x = 23
ve bu denkleme itilirse, x
o zaman eşit olacaktır -23
. Bay Escalante'nin sözleriyle, "Olumlu bir zaman, bir negatif, bir negatiftir, bir negatif zaman, bir negatif, bir pozitiftir." ... "Bu kiiiiiiidlere nasıl ulaşabilirim ?!"
x=23
, o zaman -23 olur. Soru ilerledikçe, 'Negatif bir sayıyı JS'de pozitif bir sayıya dönüştürün', ancak yukarıdakiler pozitif veya negatif olsun, herhangi bir sayıyı çevirir.
x
her zaman olumlu yapmayan bağlamındaydı . Özürlerim @myusuf.
Eksi işareti (-) pozitif sayıları negatif sayılara ve negatif sayıları pozitif sayılara dönüştürebilir. x=-y
görsel şekerdir x=(y*-1)
.
var y = -100;
var x =- y;
Başka hiç kimsenin güncelleyemeyeceği ilginç bir kod yazmak istiyorsanız şunu deneyin:
~ -X
~
operatör sayıyı 32 bitlik bir tamsayıya dönüştürür. Giriş olarak bir şamandıra varsa, hortumlanır.
Bunun biraz geç olduğunu biliyorum, ancak bununla mücadele eden insanlar için aşağıdaki işlevleri kullanabilirsiniz:
Herhangi bir sayıyı pozitif çevirin
let x = 54;
let y = -54;
let resultx = Math.abs(x); // 54
let resulty = Math.abs(y); // 54
Herhangi bir sayıyı negatif çevirin
let x = 54;
let y = -54;
let resultx = -Math.abs(x); // -54
let resulty = -Math.abs(y); // -54
Herhangi bir sayıyı ters çevir
let x = 54;
let y = -54;
let resultx = -(x); // -54
let resulty = -(y); // 54
Olumsuzdan olumluya
var X = -10 ;
var number = Math.abs(X); //result 10
Pozitif - negatif
var X = 10 ;
var number = (X)*(-1); //result -10
(-1) ile çarpmak, negatif sayıyı pozitif hale dönüştürmenin en hızlı yoludur. Ama hatamı pozitif bir sayıyı negatife dönüştürmemeye dikkat etmelisin! Bu yüzden ek kontrol gerekli ...
Sonra Math.abs, Math.floor ve parseInt en yavaş olanıdır.
https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1
Ben kendim böyle bir şey yaptım.
num<0?num*=-1:'';
Sayının negatif olup olmadığını kontrol eder ve öyleyse -1 ile çarpın Bu bir değer döndürür, yakalarsanız size kalır. Bir şeye atamak istiyorsanız, muhtemelen şöyle bir şey yapmalısınız:
var out = num<0?num*=-1:num; //I think someone already mentioned this variant.
Ama bu gerçekten hedefinizin ne olduğuna bağlı. Benim için basitti, negatifse pozitif yap, başka bir şey yapma. Dolayısıyla koddaki ''. Bu durumda üçüncül operatör kullandım çünkü istedim, çok iyi olabilir:
if(num<0)num*=-1;
Burada bitsel çözümü gördüm ve bu konuda da yorum yapmak istedim.
~--num; //Drawback for this is that num original value will be reduced by 1
Bu ruh bence çok süslü, bunu şöyle yeniden yazabiliriz:
~(num = num-1);
Basit bir ifadeyle, negatif sayıyı alırız, ondan bir tane alırız ve sonra bitsel olarak ters çeviririz. Bitsel olarak tersine çevirmiş olsaydık, normalde 1 değeri çok küçük olurdu. Bunu da yapabilirsiniz:
~num+1; //Wont change the actual num value, merely returns the new value
Bu aynı şeyi yapar ancak önce ters çevirir ve sonra pozitif sayıya 1 ekler. CANT bunu yapmanıza rağmen:
~num++; //Wont display the right value.
Bu önceliğin nedeni işe yaramayacak , num++
sonradan değerlendirilecek gibi postfix operatörleri ~ ve ++num
bit (NOT) (~) ile aynı öncelikte olmasına rağmen önekin işe yaramamasının nedeni sağdan sola değerlendirilmesidir. Onları takas etmeye çalıştım ama önek bitwise değil karşılaştırıldığında biraz titiz görünüyor. +1 işe yarayacaktır çünkü '+' daha yüksek önceliğe sahiptir ve daha sonra değerlendirilecektir.
Bu çözümü oldukça eğlenceli buldum ve sadece orada atıldığı için genişlemeye karar verdim ve ona bakan insanlar muhtemelen görmezden geliyorlardı. Evet olmasına rağmen, şamandıralarla çalışmaz.
Benim umudum, bu yazının orijinal sorudan uzaklaşmamış olması. : /
Minimal yaklaşımım
Negatif sayıyı pozitif veya tersine dönüştürmek için
var num = -24;
num -= num*2;
console.log(num)
// result = 24
Sayıyı mantıksal olarak negatife dönüştüren ve negatife 1 ekleyen ~ işlecini kullanabilirsiniz :
var x = 3;
x = (~x + 1);
console.log(x)
// result = -3
Bunu yapmanın başka bir yolunu biliyorum. Bu teknik pozitiften negatife çalışır & Vice Versa
var x = -24;
var result = x * -1;
Tersine:
var x = 58;
var result = x * -1;
CANLI KOD:
// 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);
Fonksiyonel bir programlama için Ramda bunun için güzel bir yönteme sahiptir. Aynı yöntem pozitiften negatife ve tersi yönde de geçerlidir.
Ne yaparsanız yapın, sayının her zaman pozitif olmasını istiyorsanız.
function toPositive(n){
if(n < 0){
n = n * -1;
}
return n;
}
var a = toPositive(2); // 2
var b = toPositive(-2); // 2
Bunu da deneyebilirsin, ama ben tavsiye etmiyorum:
function makePositive(n){
return Number((n*-n).toString().replace('-',''));
}
var a = makePositive(2); // 2
var b = makePositive(-2); // 2
Buradaki sorun, sayıyı negatif olarak değiştirip ardından dizeye dönüştürüp - dizeden çıkarıyor, sonra int'e dönüyor olabilirsiniz. Sanırım hangi sadece diğer işlevi kullanarak daha fazla işlem alacaktı.
Ben php bu test ve ilk işlevi daha hızlı, ama bazen JS bazı deli şeyler yapar, bu yüzden kesin olarak söyleyemeyiz.
n*-n
olmalı n*-1
. Tip dönüşümleri ve yöntem çağrısı ilk örneğin basitliği ile karşılaştırıldığında çok verimsiz olduğu için yine de örneği tamamen kaldırırdım. JS'nin tuhaflığı bile burada yardımcı olamaz