แปลงจำนวนลบเป็นค่าบวกใน JavaScript


308

มีฟังก์ชั่นคณิตศาสตร์ใน JavaScript ที่แปลงตัวเลขเป็นค่าบวกหรือไม่

คำตอบ:


703

คุณสามารถใช้สิ่งนี้ ...

Math.abs(x)

Math​.abs()| MDN


1
คุณอาจต้องการพิจารณา ~ x + 1 ด้วยซ้ำ มันค่อนข้างเร็ว แต่ไม่ชัดเจนว่ามันกำลังทำอะไรอยู่ เพิ่มสิ่งนี้ขึ้นเพื่อแสดงความแตกต่าง: jsperf.com/absolute-int
omgaz

22
@omgaz พวกเขาจะไม่เหมือนกัน ... แต่var x = -100; ~x+1 === 100 ทำให้เป็นบวกเสมอในขณะที่การเสริมนั้นเพียงแค่พลิกกลับสัญญาณ var x = 100; ~x+1 === -100Math.abs
jduncanator

คุณอาจต้องการพิจารณา -x มันค่อนข้างเร็ว!
amara

93

เกี่ยวกับx *= -1อะไร ฉันชอบความเรียบง่าย


17
ในขณะที่ง่ายมันทำให้สมมติฐานที่ว่าจำนวนจะเป็นลบเสมอ หากกรณีการใช้งานเป็นเช่นนั้นก็น่ากลัว มิฉะนั้นฉันจะแนะนำอย่างระมัดระวัง
myusuf

4
ฉันไม่เห็นด้วย @myusuf หมายเลขใด ๆ ที่xจะถูกพลิก ถ้าx = 23และผลักลงในสมการนั้นแล้วจะเท่ากับx -23ในคำพูดของ Mr. Escalante "เวลาบวกที่ลบเท่ากับลบลบคูณลบเป็นลบบวก" ... "ฉันจะไปถึง kiiiiiiids เหล่านี้ได้อย่างไร!"
ExcellentSP

2
เมื่อวานนี้อย่างแน่นอน @Shane ถ้าx=23มันจะกลายเป็น -23 เมื่อคำถามเกิดขึ้น 'แปลงจำนวนลบให้เป็นจำนวนบวกใน JS' แต่ข้างบนจะพลิกตัวเลขใด ๆ ไม่ว่าจะเป็นบวกหรือลบ
myusuf

2
เข้าใจ การตีความความคิดเห็นของคุณของฉันอยู่ในบริบทของการพลิกหมายเลขและไม่ทำให้xเป็นบวกเสมอ คำขอโทษของฉัน @ myusuf
ExcellentSP

1
เพียงแค่เตือนว่าวิธีนี้ใช้ไม่ได้กับเลขทศนิยมมันจะได้รับเฉพาะส่วนทศนิยม
Oscar Luza

46

Math.abs(x)หรือถ้าคุณเป็นบางอย่างx = -xคุ้มค่าเป็นลบก่อนการแปลงเพียงย่อหน้าเครื่องหมายลบปกติ:




12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

ฉันพบโซลูชันนี้เข้าใจง่าย


8

หากคุณต้องการเขียนโค้ดที่น่าสนใจที่ไม่มีใครสามารถอัปเดตได้ให้ลองทำดังนี้:

~ --x


1
สิ่งนี้จะไม่ทำงานกับคะแนนลอยแม้ว่า ... และค่าของ x จะเปลี่ยนไปเช่นกัน
Alexis Wilke

ฉันเดาว่าคุณไม่สามารถเปลี่ยน x: ~ --x; ++ x
Kyle

1
ไคล์ตัว~ดำเนินการแปลงตัวเลขเป็นจำนวนเต็ม 32 บิต หากคุณมีการลอยเป็นอินพุทก็จะถูก hosed
Alexis Wilke

7

ฉันรู้ว่ามันช้าไปหน่อย แต่สำหรับคนที่ดิ้นรนกับสิ่งนี้คุณสามารถใช้ฟังก์ชั่นต่อไปนี้:

  • เปลี่ยนจำนวนเป็นบวก

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
  • เปลี่ยนจำนวนลบใด ๆ

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
  • สลับหมายเลขใด ๆ

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54

6

เป็นลบ

var X = -10 ;
var number = Math.abs(X);     //result 10

บวกถึงลบ

var X = 10 ;
var number = (X)*(-1);       //result -10

ฉันเห็นสิ่งที่คุณต้องการแสดง แต่วิธีที่คุณทำให้สับสน บางทีคุณควรระบุ: เป็นบวก: ใช้ abs เพื่อลบ: abs (x) * -1 ด้วยวิธีนี้คุณไม่ได้หมายความว่าเครื่องหมาย X เดิมคืออะไร
Dionys

5

การคูณด้วย (-1) เป็นวิธีที่เร็วที่สุดในการแปลงจำนวนลบให้เป็นบวก แต่คุณต้องระวังอย่าแปลงความผิดพลาดของฉันให้เป็นจำนวนบวกเป็นลบ! จำเป็นต้องมีการตรวจสอบเพิ่มเติม ...

จากนั้น Math.abs, Math.floor และ parseInt จะช้าที่สุด

ป้อนคำอธิบายรูปภาพที่นี่

https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1


1
พวกเราบางคนลืมว่าคณิตศาสตร์พื้นฐานที่มีประโยชน์สามารถเกิดขึ้นได้อย่างไรในกรณีเช่นนี้ ขอบคุณที่เตือนฉันถึงความเรียบง่ายเช่นนั้น
Alexander Dixon

2

ฉันทำอะไรแบบนี้เอง

num<0?num*=-1:'';

มันจะตรวจสอบว่าจำนวนเป็นลบและถ้ามันเป็นคูณด้วย -1 นี้จะคืนค่ามันขึ้นอยู่กับคุณถ้าคุณจับมัน ในกรณีที่คุณต้องการมอบหมายให้คุณควรทำสิ่งต่อไปนี้

var out = num<0?num*=-1:num; //I think someone already mentioned this variant.

แต่มันขึ้นอยู่กับว่าเป้าหมายของคุณคืออะไร สำหรับฉันมันง่ายทำในเชิงบวกถ้าเป็นลบไม่ทำอะไรเลย ดังนั้น '' ในรหัส ในกรณีนี้ฉันใช้โอเปอเรเตอร์ระดับอุดมศึกษาเพราะฉันต้องการมันเป็นอย่างดี:

if(num<0)num*=-1;

ฉันเห็นวิธีแก้ปัญหาระดับบิตที่นี่และต้องการแสดงความคิดเห็นในที่นี้เช่นกัน

~--num; //Drawback for this is that num original value will be reduced by 1

soultion นี้แฟนซีมากในความคิดของฉันเราสามารถเขียนมันเช่นนี้:

~(num = num-1);

ในแง่ง่ายเราเอาจำนวนลบออกไปหนึ่งอันจากนั้นก็กลับด้านหน่อย ถ้าเรากลับด้าน bitwise โดยปกติแล้วเราจะได้ค่า 1 น้อยเกินไป คุณยังสามารถทำสิ่งนี้:

~num+1; //Wont change the actual num value, merely returns the new value

นั่นจะทำแบบเดียวกัน แต่จะกลับด้านก่อนแล้วบวก 1 กับจำนวนบวก แม้ว่าคุณจะไม่ทำเช่นนี้:

~num++; //Wont display the right value.

ที่จะไม่ทำงานสาเหตุของการมีความสำคัญผู้ประกอบการ postfix เช่นnum++จะได้รับการประเมินก่อน ~ และเหตุผลคำนำหน้า++numจะไม่ทำงานแม้ว่ามันจะมีความสำคัญเช่นเดียวกับ bitwise NOT (~) เป็นสาเหตุที่มีการประเมินจากขวาไปซ้าย ฉันพยายามที่จะสลับมันรอบ ๆ แต่ดูเหมือนว่าคำนำหน้านั้นค่อนข้างดีเมื่อเทียบกับ bitwise NOT +1 จะทำงานได้เนื่องจาก '+' มีลำดับความสำคัญสูงกว่าและจะถูกประเมินในภายหลัง

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

ความหวังของฉันอยู่ที่โพสต์นี้ไม่ได้ย้ายไปจากคำถามเดิม : /



0

คุณสามารถใช้โอเปอเรเตอร์~ที่แปลงตัวเลขเป็นลบและเพิ่ม 1 เป็นลบได้ในเชิงตรรกะ:

var x = 3;
x = (~x + 1);
console.log(x)
// result = -3


0

ฉันรู้วิธีอื่นที่จะทำ เทคนิคนี้ทำงานในเชิงลบเป็นบวก & รองในทางกลับกัน

var x = -24;
var result = x * -1;

ในทางกลับกัน:

var x = 58;
var result = x * -1;

รหัสสด:

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


ที่ไม่ตอบคำถาม dave ขอฟังก์ชั่นที่มีการเปลี่ยนแปลงค่าบวกลบและบวกกับบวก
RaphaMex

คำถามของเขากล่าวว่า "มีฟังก์ชันทางคณิตศาสตร์ใน JavaScript ที่แปลงตัวเลขเป็นค่าบวกหรือไม่" เขาไม่ได้พูดถึงแง่บวกถึงแง่บวก เขาเพียงกล่าวถึงเชิงลบเป็นบวก ทำไมคุณต้องการแปลงค่าเป็นบวก ค่าจะเหมือนกัน
Tarryk Ttmm

คุณสามารถขอคำชี้แจงในความคิดเห็นด้านล่างคำถาม อย่างไรก็ตามมีคำตอบที่ยอมรับได้ว่าเป็นคำตอบที่ถูกต้อง คุณสามารถอ่านอีกครั้งและดูว่ามีฟังก์ชั่นในตัวที่ ... แปลงเป็นบวกเป็นบวก
RaphaMex

0

สำหรับการเขียนโปรแกรมการทำงาน Ramda มีวิธีที่ดีสำหรับเรื่องนี้ วิธีการเดียวกันนี้เริ่มจากบวกไปยังลบและกลับกัน

https://ramdajs.com/docs/#negate


0

ถ้าคุณต้องการให้จำนวนเป็นบวกเสมอไม่ว่าคุณจะทำอะไร

function toPositive(n){
    if(n < 0){
        n = n * -1;
    }
    return n;
}
var a = toPositive(2);  // 2
var b = toPositive(-2); // 2

คุณสามารถลองสิ่งนี้ได้ แต่ฉันไม่แนะนำ:

function makePositive(n){
    return Number((n*-n).toString().replace('-','')); 
}
var a = makePositive(2);  // 2
var b = makePositive(-2); // 2

ปัญหานี้คือคุณสามารถเปลี่ยนจำนวนเป็นลบจากนั้นแปลงเป็นสตริงและลบ-จากสตริงจากนั้นแปลงกลับเป็น int ซึ่งฉันคิดว่าจะใช้เวลาประมวลผลมากขึ้นแล้วเพียงแค่ใช้ฟังก์ชั่นอื่น ๆ

ฉันทดสอบมันด้วย PHP และฟังก์ชั่นแรกนั้นเร็วกว่า แต่บางครั้ง JS ทำสิ่งที่บ้าคลั่งดังนั้นฉันจึงไม่สามารถพูดได้อย่างแน่นอน


ตัวอย่างที่สองส่งเอาต์พุตกำลังของหมายเลขอินพุต ควรจะเป็นn*-n n*-1ฉันจะลบตัวอย่างโดยสิ้นเชิงเนื่องจากการแปลงประเภทและการเรียกใช้เมธอดไม่มีประสิทธิภาพมากเมื่อเทียบกับความเรียบง่ายของตัวอย่างแรก แม้แต่การเล่นโวหารของ JS ก็ไม่สามารถช่วยได้ที่นี่
Gust van de Wal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.