ทำให้จำนวนลบเป็นบวก


146

ฉันมีวิธีการจาวาที่ฉันรวมชุดของตัวเลข อย่างไรก็ตามฉันต้องการให้ตัวเลขเชิงลบใด ๆ ถูกถือว่าเป็นผลบวก ดังนั้น (1) + (2) + (1) + (- 1) ควรเท่ากับ 5

ฉันแน่ใจว่ามีวิธีง่าย ๆ ในการทำเช่นนี้ - ฉันไม่รู้


ง่ายๆเลขstackoverflow.com/a/5220597/185022 :)
AZ_

5
ทำให้ฉันประหลาดใจว่าคำถามพื้นฐานเหล่านี้ทำให้ upvotes มากมาย ...
Jose Rui Santos

คำถามของฉันมีความเหมาะสมมากกว่านี้ แต่ยังจะมี downvotes เพื่อให้มากขึ้น
ไม่มีใคร

คำตอบ:



103

แนวคิดที่คุณกำลังอธิบายเรียกว่า "ค่าสัมบูรณ์" และ Java มีฟังก์ชันที่เรียกว่าMath.absสำหรับคุณ หรือคุณสามารถหลีกเลี่ยงการเรียกใช้ฟังก์ชันและทำมันเอง:

number = (number < 0 ? -number : number);

หรือ

if (number < 0)
    number = -number;

21
โอ้เวลาที่กระอักกระอ่วน - มีคำตอบที่ดีพอ ๆ กันมากมายที่ฉันอาจลบของฉันได้เช่นกัน แต่ฉันจะเสีย 40 คะแนนและฉันจะไม่จับ Jon Skeet ถ้าฉันทำอย่างนั้น
Paul Tomblin

3
ขออภัย -1 สำหรับการสร้างการโทรห้องสมุดมาตรฐานอีกครั้ง
cletus

12
@cletus คุณสังเกตเห็นว่าฉันได้พูดถึงการโทรห้องสมุดมาตรฐานแล้วหรือยัง หรือว่าในกรณีนี้ "reinvent" ใช้คำสั่งน้อยลงในการเรียกไลบรารี?
พอลทอมบลิ

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

+1 ด้วยเนื่องจาก @cletus -1 คุณสร้างโปรแกรมเมอร์ที่ดีขึ้นโดยแสดงทั้งโซลูชันมาตรฐานที่ดีที่สุดให้กับปัญหาและสิ่งที่โซลูชันนั้นทำจริง ๆ (หรือสิ่งที่เทียบเคียงได้)
Francisco Zarabozo



8

รหัสนี้ไม่ปลอดภัยที่จะถูกเรียกในจำนวนบวก

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20

3
เราสามารถคูณด้วย -1 แทนที่จะทำสิ่งนี้ ฉันไม่มีอะไรเลยหรือ
Siva Kranthi Kumar

7

ลองสิ่งนี้ (ค่าลบที่อยู่ด้านหน้าของ x ใช้ได้เนื่องจากมันเป็นโอเปอเรเตอร์ unary ค้นหาเพิ่มเติมได้ที่นี่ ):

int answer = -x;

ด้วยวิธีนี้คุณสามารถเปลี่ยนค่าบวกเป็นลบและลบเป็นบวกได้


อย่างไรก็ตามหากคุณต้องการให้จำนวนลบเป็นค่าบวกให้ลองทำดังนี้:

int answer = Math.abs(x);

หรือหากคุณไม่ต้องการใช้วิธี abs () ด้วยเหตุผลบางประการลองทำสิ่งนี้:

int answer = Math.sqrt(Math.pow(x, 2));

หวังว่ามันจะช่วย! โชคดี!


6

คุณกำลังถามเกี่ยวกับค่าสัมบูรณ์

Math.abs (... ) เป็นฟังก์ชันที่คุณอาจต้องการ


6

Math.abs()คุณต้องการที่จะห่อจำนวนในแต่ละ เช่น

System.out.println(Math.abs(-1));

พิมพ์ออกมา "1"

หากคุณต้องการหลีกเลี่ยงการเขียน - Math.ส่วนคุณสามารถรวมคณิตศาสตร์ใช้แบบคงที่ แค่เขียน

import static java.lang.Math.abs;

พร้อมกับการนำเข้าของคุณและคุณสามารถอ้างถึงabs()ฟังก์ชั่นเพียงแค่เขียน

System.out.println(abs(-1));

5

วิธีที่ง่ายที่สุดถ้าใช้วิธีนี้เพื่อตัดแต่ละหมายเลขในการโทร Math.abs () ดังนั้นคุณควรเพิ่ม:

Math.abs(1) + Math.abs(2) + Math.abs(1) + Math.abs(-1)

ด้วยการเปลี่ยนแปลงเชิงตรรกะเพื่อแสดงให้เห็นว่าโครงสร้างของโค้ดของคุณเป็นอย่างไร บางทีอาจจะ แต่ก็ทำในสิ่งที่คุณต้องการ


3
คุณสามารถทำให้ verbose น้อยลงด้วยการนำเข้าแบบคงที่
Dan Dyer

1
หากเขามีการควบคุมค่าโดยตรงมันจะดีกว่าหรือไม่ที่จะลบ-เครื่องหมาย? หรืออย่างอื่นรวมถึงถ้าเขาไม่สามารถควบคุมมันจะดีกว่าหรือไม่ที่จะใช้ฟังก์ชั่นเช่นabsoluteSum( int[] values ){ /*loop with Math.abs()*/ }แทนที่จะห่อ Math.abs () ด้วยตนเองในแต่ละค่า [-1]
XenoRo

ฉันเห็นด้วย. การรวมตรรกะในฟังก์ชันที่มีชื่อจะทำให้ชัดเจนยิ่งขึ้น
Eddie

5

เมื่อคุณต้องการแสดงค่าโดยไม่มีแนวคิดของการสูญเสียหรือขาด (ค่าลบ) ที่เรียกว่า "ค่าสัมบูรณ์"


"If it's positive, maintain it. If it's negative, negate it"ตรรกะที่จะได้รับค่าสัมบูรณ์ง่ายมาก:


สิ่งนี้หมายความว่าตรรกะและรหัสของคุณควรทำงานดังนี้:

//If value is negative...
if ( value < 0 ) {
  //...negate it (make it a negative negative-value, thus a positive value).
  value = negate(value);
}

มี 2 ​​วิธีที่คุณสามารถปฏิเสธค่าได้:

  1. โดยดีละทิ้งคุณค่าของมัน: value = (-value);
  2. โดยการคูณด้วย "ลบ 100%" หรือ "-1": value = value * (-1);

จริง ๆ แล้วทั้งสองเป็นเหรียญเดียวกัน มันเป็นแค่ที่คุณมักจะจำไม่ได้ว่าเป็นจริงvalue = (-value);value = 1 * (-value);


สำหรับวิธีการที่คุณทำใน Java มันง่ายมากเพราะ Java มีฟังก์ชันอยู่แล้วในMath class:value = Math.abs(value);

ใช่การทำโดยไม่ต้องMath.abs()เป็นเพียงบรรทัดของรหัสที่มีคณิตศาสตร์ง่าย ๆ แต่ทำไมรหัสของคุณดูน่าเกลียด? เพียงใช้Math.abs()ฟังก์ชั่นที่มีให้ของ Java ! พวกเขาให้เหตุผล!

หากคุณจำเป็นอย่างยิ่งที่จะข้ามฟังก์ชั่นที่คุณสามารถใช้value = (value < 0) ? (-value) : value;ซึ่งเป็นเพียงรุ่นขนาดกะทัดรัดมากขึ้นของรหัสที่ผมกล่าวถึงในตรรกะ (3) ส่วนที่ใช้ประกอบการ Ternary (? : )


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

แทนที่จะทำการตรวจสอบที่ซับซ้อนคุณสามารถรับค่าสัมบูรณ์และคัดค้านได้: negativeValue = (-Math.abs(value));


เมื่อคำนึงถึงเรื่องนี้และเมื่อพิจารณาถึงกรณีที่มีผลรวมของตัวเลขหลาย ๆ อย่างเช่นของคุณคุณควรใช้ฟังก์ชัน:

int getSumOfAllAbsolutes(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += Math.abs(values[i]);
  }
  return total;
}

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

int[] makeAllAbsolute(int[] values){
  //@TIP: You can also make a reference-based version of this function, so that allocating 'absolutes[]' is not needed, thus optimizing.
  int[] absolutes = values.clone();
  for(int i=0; i<values.lenght; i++){
    absolutes[i] = Math.abs(values[i]);
  }
  return absolutes;
}

int getSumOfAllValues(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += values[i];
  }
return total;
}

int getSumOfAllAbsolutes(int[] values){
  return getSumOfAllValues(makeAllAbsolute(values));
}


2

หากคุณสนใจกลไกของส่วนประกอบทั้งสองนี่เป็นวิธีที่ไม่มีประสิทธิภาพอย่างแท้จริง

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}

ทำไมมันไม่มีประสิทธิภาพอย่างแน่นอน? ฉันไม่เห็นลูปใด ๆ ที่ทำให้ไม่มีประสิทธิภาพ ฉันพลาดอะไรไปหรือเปล่า?
aldok

2

ฉันจะแนะนำวิธีแก้ไขปัญหาต่อไปนี้:

ไม่สนุก lib:

    value = (value*value)/value

(ด้านบนใช้งานไม่ได้)

ด้วยความสนุก lib:

   value = Math.abs(value);

14
คนแรกจะไม่ทำให้จำนวนลบอีกครั้งหรือไม่
user2875404

1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

อีกวิธีหนึ่งคือ:

int i = -123;
System.out.println(Math.abs(i));

1

Math.abs()สามารถใช้ฟังก์ชันไลบรารีได้
Math.abs()ส่งคืนค่าสัมบูรณ์ของอาร์กิวเมนต์

  • ถ้าอาร์กิวเมนต์เป็นลบมันจะส่งกลับการปฏิเสธของอาร์กิวเมนต์
  • หากอาร์กิวเมนต์เป็นค่าบวกจะส่งคืนตัวเลขตามที่เป็นอยู่

เช่น:

  1. int x=-5;
    System.out.println(Math.abs(x));

ผลลัพธ์: 5

  1. int y=6;
    System.out.println(Math.abs(y));

ผลลัพธ์: 6


1

ในการแปลงจำนวนลบให้เป็นจำนวนบวก (ซึ่งเรียกว่าค่าสัมบูรณ์) ให้ใช้ Math.abs () วิธีการ Math.abs () นี้ใช้งานได้เช่นนี้

“number = (number < 0 ? -number : number);".

ในตัวอย่างด้านล่างMath.abs(-1)จะแปลงจำนวนลบ 1 เป็นบวก 1

ตัวอย่าง

โมฆะคงที่สาธารณะหลัก (String [] args) {

    int total = 1 + 1 + 1 + 1 + (-1);
    
    //output 3
    System.out.println("Total : " + total);
    
    int total2 = 1 + 1 + 1 + 1 + Math.abs(-1);
    
    //output 5
    System.out.println("Total 2 (absolute value) : " + total2);
    
}

เอาท์พุต

ทั้งหมด: 3 รวม 2 (ค่าสัมบูรณ์): 5


0

ฉันต้องการค่าสัมบูรณ์นานและลึกเข้าไปใน Math.abs และพบว่าถ้าอาร์กิวเมนต์ของฉันน้อยกว่า LONG.MIN_VAL ซึ่งเป็น -9223372036854775808l -9223372036854775808l แล้วฟังก์ชัน abs จะไม่คืนค่าสัมบูรณ์ แต่เพียงค่าต่ำสุด ในกรณีนี้หากรหัสของคุณใช้ค่า abs นี้มากขึ้นแสดงว่าอาจมีปัญหา


4
จุดรวมของ Long.MIN_VAL คือคุณไม่สามารถมีความยาวที่ "น้อยกว่า LONG.MIN_VAL" ได้
พอลทอมบลิน

0

คุณกรุณาลองอันนี้หน่อยได้ไหม?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}

4
ในคำถามอายุสิบปีที่มีคำตอบอีก 17 คำตอบคุณควรจะอธิบายว่าคำถามคำตอบของคุณคืออะไร การเริ่มคำตอบด้วยคำถามเป็นวิธีที่ดีในการปิดถ้ามันจบลงในคิวการตรวจสอบ
Jason Aller


-3

อย่าทำอย่างนี้

จำนวน = (หมายเลข <0? -number: number);

หรือ

if (number <0) number = -number;

นี่จะเป็นข้อบกพร่องเมื่อคุณเรียกใช้พบข้อบกพร่องในรหัสของคุณมันจะรายงานว่าเป็น RV_NEGATING_RESULT_OF

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