จำนวนบวกเป็นจำนวนลบใน JavaScript?


104

โดยทั่วไปการกลับกันของ abs ถ้าฉันมี:

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

ไม่ว่าคอนโซลใดจะส่งคืนจำนวนบวกเสมอ ฉันจะแก้ไขปัญหานี้ได้อย่างไร

ถ้าฉันทำ:

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')
}

มันใช้งานได้ แต่มันไม่ใช่ "DRY" และโง่แค่ไหนที่มีโค้ดทั้งหมดเพียงแค่สำหรับไฟล์-.


4
ฉันแน่ใจว่ามีปลั๊กอิน jQuery สำหรับสิ่งนั้น
Jakub Hampl

คำตอบ:


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

อย่างไรก็ตามคุณตระหนักดีว่าสำหรับรหัสของคุณ

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

หากดัชนีที่พบคือ 3 และ slideNum เป็น 3
ดังนั้น 3 <3-1 => false
ดังนั้น slideNum จะยังคงเป็นบวก ??

ดูเหมือนข้อผิดพลาดทางตรรกะสำหรับฉันมากกว่า



30

สูตรพื้นฐานในการย้อนกลับค่าบวกเป็นลบหรือลบเป็นบวก:

i - (i * 2)

32
เกิดอะไรขึ้นi * -1? นอกจากนี้ฉันไม่แน่ใจว่าสิ่งนี้จะตอบคำถามที่แท้จริง
Andrew Barber

5
มันขึ้นอยู่กับสถาปัตยกรรม แต่ 0 - ฉันอาจเร็วกว่านี้
Ben Taliadoros

@AndrewBarber i * -1ดูเหมือนจะไม่ทำงานใน Chrome เวอร์ชันปัจจุบัน ใช้ -Math.abs (1) ไม่แน่ใจว่าทำไมถึงใช้งานได้หวังว่าจะมีคนขยายความได้ว่าทำไม
Philip Rollins

@PhilipRollins i * -1จะทำงานเสมอ ฉันไม่รู้ว่าคุณพยายามอย่างไรบางทีคุณอาจพิมพ์ผิด แต่ ... มีอะไรผิดปกติi = -iแทนที่จะi = i * -1(หรือ i *= -1) กลับบวกเป็นลบหรือลบเป็นบวก?
Diego ZoracKy

@DiegoZoracKy ฉันก็คิดเช่นนั้นเช่นกัน แต่ไม่ใช่สำหรับ Chrome เวอร์ชันที่ฉันใช้งานอยู่และมันใช้งานได้กับ firefox ดังนั้นการพิมพ์ผิดจึงไม่อยู่ในคำถาม ตอนนี้ฉันใช้ Linux แต่คุณสามารถทดสอบทฤษฎีของคุณบน Chrome ได้ฟรี โปรดทราบว่าการอัปเดตอัตโนมัติของ Chrome จะถูกนำไปใช้แล้วและข้อบกพร่องใหม่ ๆ จะถูกส่งไปยังชุมชนซึ่งหมายความว่านี่อาจเป็นข้อบกพร่องที่ใช้เวลาเพียงไม่กี่วันและตอนนี้ได้รับการแก้ไขตลอดไป
Philip Rollins

9

ในการรับตัวเลขเชิงลบใน JavaScript คุณสามารถใช้ไฟล์ ~ดำเนินการบิตได้ตลอดเวลา

ตัวอย่างเช่นหากคุณมีa = 1000และต้องการแปลงเป็นค่าลบคุณสามารถทำสิ่งต่อไปนี้:

a = ~a + 1;

ซึ่งจะส่งผลในการเป็นa-1000


เร็วกว่าการคูณด้วยลบ 1 หรือไม่?
ryandawkins

ฉันไม่แน่ใจว่าจะพูดตามตรงสิ่งที่คุณต้องพิจารณา
Benjamin Williams

@RyanDawkins สิ่งนี้จะไม่เร็วไปกว่าการคูณด้วย -1 Javascript ไม่มีตัวดำเนินการบูลีนเหมือนอย่างที่ C ทำ ดังนั้นในการดำเนินการบูลีน JS ต้องแปลงระหว่างประเภทต่างๆภายใต้ประทุน
spinlock

2
ทำไมไม่a = -a?
Diego ZoracKy

Bitwise ไม่ลบล้างตัวเลขอย่างแน่นอน ~1000คือไม่-1001 -1000
brentonstrine

7
var x = 100;
var negX = ( -x ); // => -100

1
โปรดเพิ่มคำอธิบายในการแก้ไขคำตอบของคุณหลีกเลี่ยงคำตอบเฉพาะรหัส
GGO

1
@GGO ... ฉันไม่แน่ใจว่ายังไม่ชัดเจนอย่างไร แต่แน่ใจว่า: โดยการเพิ่มเครื่องหมายลบหน้าค่าจากนั้นใส่เครื่องหมายในวงเล็บไว้ค่าจะได้รับการประเมิน ... ผลลัพธ์คือการปฏิเสธของ มูลค่า.
tpayne84

6

แน่ใจหรือว่าการควบคุมกำลังเข้าสู่ร่างกายของif? ในสภาพที่ifเคยเป็นจริงหรือไม่? เพราะหากไม่เป็นเช่นนั้นร่างของifพินัยกรรมจะไม่ถูกประหารชีวิตและslideNumจะยังคงเป็นบวก ฉันจะคาดเดาว่านี่อาจเป็นสิ่งที่คุณเห็น

หากฉันลองสิ่งต่อไปนี้ใน Firebug ดูเหมือนว่าจะได้ผล:

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

slideNum *= -1ควรทำงานด้วย เท่าที่ควรMath.abs(slideNum) * -1.


ฉันเพิ่งทำif($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }และฉันยังคงกลับมาเป็นบวกใน console.log นั้น?
Oscar Godson

@Oscar สิ่งที่ Vivin พูดนั้น$this.find('.pdxslide-activeSlide').index() < slideNum-1เป็นเท็จเสมอ
David Tang

4

ถ้าคุณไม่อยากใช้ Math.Abs ​​* -1 คุณสามารถใช้คำสั่ง if ง่ายๆนี้ได้: P

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

แน่นอนว่าคุณสามารถทำให้ฟังก์ชันนี้เป็นแบบนี้ได้

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

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

หวังว่านี่จะช่วยได้! Math.abs น่าจะเหมาะกับคุณ แต่ถ้ามันไม่ได้เล็กน้อย


ก่อนที่จะตอบคำถามคุณควรพิจารณาเมื่อถูกถามด้วย คำถามนี้เกือบ 5 ขวบ ดังนั้นหากเทคโนโลยีไม่เปลี่ยนแปลงและตอนนี้มีคำตอบที่ดีกว่า / เหมาะสมกว่ามักจะไม่มีการเพิ่มมูลค่ามากนักโดยการเสนอคำตอบอื่น
อิกอ

1
ฉันเองมองผ่านคำถามเก่า ๆ ล้นสแต็กตลอดเวลา แน่นอนว่านี่จะไม่เป็นประโยชน์สำหรับมือโปร แต่บางทีมือใหม่อาจจะชอบเคล็ดลับ! ที่กล่าวว่าวิธีที่ง่ายที่สุดคือข้างบน -Math.Abs ​​(-3) ตามที่กล่าวไว้ข้างต้นคณิตศาสตร์ค่าสัมประสิทธิ์เปลี่ยนค่าเป็นบวก จากนั้นคำนำหน้าเชิงลบทำให้เป็นลบ
Ash Pettit

โหวตแล้ว โดยส่วนตัวแล้วฉันรู้สึกซาบซึ้งกับคำตอบนี้และพบว่ามีคุณค่า คุณสามารถเรียนรู้จากใครก็ได้
jeremysawesome

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

ผลลัพธ์: -10

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

ผลลัพธ์: 10

ถ้าคุณหารด้วยลบ 1 มันจะพลิกเลขไปทางใดทางหนึ่งเสมอ


3

Javascript มีตัวดำเนินการเฉพาะสำหรับสิ่งนี้: unary negationปฏิเสธเอก

TL; DR: มันคือเครื่องหมายลบ!

หากต้องการลบล้างตัวเลขให้นำหน้าด้วย-วิธีที่เข้าใจง่ายที่สุด ไม่ต้องเขียนฟังก์ชันใช้การMath.abs()คูณ-1หรือใช้ตัวดำเนินการบิต

การปฏิเสธ Unary ใช้งานได้กับตัวอักษรจำนวน:

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

มันทำงานกับตัวแปรด้วย:

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

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

คุณยังสามารถใช้ได้หลายครั้งหากคุณใช้ตัวดำเนินการจัดกลุ่ม (aka วงเล็บ:

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)

ทั้งหมดข้างต้นทำงานร่วมกับตัวแปรเช่นกัน



1

ใช้ 0 - x

x เป็นตัวเลขที่คุณต้องการกลับด้าน


3
แค่-xพอเพียง
Antti Haapala

1
ผลลัพธ์เพียง -x เป็น -0 วิธีนี้จะดีกว่าถ้ามีเลขศูนย์
chrismarx


0

ในวานิลลาจาวาสคริปต์

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

โดยที่ตัวเลขด้านบนคือจำนวนบวกที่คุณต้องการแปลง

รหัสนี้จะแปลงเพียงตัวเลขบวกเป็นจำนวนลบง่ายๆโดยการคูณด้วย -1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.