Buat angka negatif menjadi positif


146

Saya memiliki metode Java di mana saya menjumlahkan satu set angka. Namun, saya ingin angka negatif diperlakukan sebagai positif. Jadi (1) + (2) + (1) + (- 1) harus sama dengan 5.

Saya yakin ada cara yang sangat mudah untuk melakukan ini - saya hanya tidak tahu caranya.


matematika sederhana stackoverflow.com/a/5220597/185022 :)
AZ_

5
Buat saya takjub bagaimana pertanyaan mendasar seperti itu dapat mendapatkan begitu banyak upvotes ...
Jose Rui Santos

Pertanyaan saya lebih masuk akal daripada ini tetapi masih banyak downvotes
no

Jawaban:



103

Konsep yang Anda gambarkan disebut "nilai absolut", dan Java memiliki fungsi bernama Math.abs untuk melakukannya untuk Anda. Atau Anda dapat menghindari panggilan fungsi dan melakukannya sendiri:

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

atau

if (number < 0)
    number = -number;

21
Oh, dilema waktu - ada begitu banyak jawaban yang sama baiknya, sehingga saya mungkin juga menghapus jawaban saya. Tapi kemudian saya akan kehilangan 40 poin, dan saya tidak akan pernah bisa menangkap Jon Skeet jika saya melakukannya.
Paul Tomblin

3
Maaf -1 karena menemukan kembali panggilan perpustakaan standar.
cletus

12
@cletus, apakah Anda memperhatikan bahwa saya telah menyebutkan panggilan perpustakaan standar? Atau dalam hal ini, "reinvent" mengambil lebih sedikit instruksi yang memanggil perpustakaan?
Paul Tomblin

Juga layak untuk memahami detail di balik panggilan perpustakaan. Terutama jika ada efek samping pada panggilan perpustakaan, atau masalah kinerja seperti yang disebutkan Paul.
simon

Juga memberi +1 karena @cletus -1. Anda membuat programmer yang lebih baik dengan menunjukkan solusi standar terbaik untuk suatu masalah DAN apa yang sebenarnya dilakukan oleh solusi tersebut (atau sesuatu yang sebanding dengannya).
Francisco Zarabozo


12

Gunakan absfungsinya:

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);

8

Kode ini tidak aman untuk dipanggil ke nomor positif.

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

3
Kita dapat mengalikan dengan -1 alih-alih melakukan ini. Apakah saya kehilangan sesuatu?
Siva Kranthi Kumar

7

Coba ini (negatif di depan x valid karena merupakan operator unary, temukan lebih lanjut di sini ):

int answer = -x;

Dengan ini, Anda dapat mengubah positif ke negatif dan negatif ke positif.


Namun , jika Anda hanya ingin membuat angka negatif positif maka coba ini:

int answer = Math.abs(x);

ATAU , jika Anda memilih untuk tidak menggunakan metode abs () karena alasan tertentu, cobalah ini:

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

Semoga ini bisa membantu! Semoga berhasil!


6

Apakah Anda bertanya tentang nilai absolut?

Math.abs (...) adalah fungsi yang mungkin Anda inginkan.


6

Anda ingin memasukkan setiap nomor Math.abs(). misalnya

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

mencetak "1".

Jika Anda ingin menghindari penulisan Math.bagian-, Anda dapat memasukkan util Matematika secara statis. Cukup tulis

import static java.lang.Math.abs;

bersama dengan impor Anda, dan Anda dapat merujuk ke abs()-fungsi hanya dengan menulis

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

5

Cara termudah, jika verbose untuk melakukan ini adalah dengan membungkus setiap nomor dalam panggilan Math.abs (), jadi Anda akan menambahkan:

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

dengan perubahan logika untuk mencerminkan bagaimana kode Anda terstruktur. Verbose, mungkin, tetapi ia melakukan apa yang Anda inginkan.


3
Anda bisa membuatnya kurang verbose dengan impor statis.
Dan Dyer

1
Jika ia memiliki kendali langsung atas nilai-nilai, bukankah lebih baik menghapus -tanda - tanda itu saja? Atau sebaliknya, termasuk jika dia tidak memiliki kontrol, bukankah lebih baik menggunakan fungsi seperti absoluteSum( int[] values ){ /*loop with Math.abs()*/ }daripada membungkus Math.abs () secara manual di setiap nilai? [-1]
XenoRo

Saya setuju. Enkapsulasi logika dalam fungsi yang dinamai akan membuat ini lebih jelas.
Eddie

5

Ketika Anda perlu merepresentasikan nilai tanpa konsep kerugian atau ketidakhadiran (nilai negatif), itu disebut "nilai absolut".


Logika untuk mendapatkan nilai absolut sangat sederhana: "If it's positive, maintain it. If it's negative, negate it".


Artinya, logika dan kode Anda harus berfungsi seperti berikut:

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

Ada 2 cara Anda dapat meniadakan nilai:

  1. Dengan, meniadakan nilainya: value = (-value);
  2. Dengan mengalikannya dengan "100% negatif", atau "-1": value = value * (-1);

Keduanya sebenarnya adalah dua sisi dari koin yang sama. Hanya saja biasanya Anda tidak ingat itu value = (-value);sebenarnya value = 1 * (-value);.


Nah, seperti bagaimana Anda benar-benar melakukannya di Jawa, itu sangat sederhana, karena Java sudah menyediakan fungsi untuk itu, di Math class:value = Math.abs(value);

Ya, melakukannya tanpa Math.abs()hanya sebaris kode dengan matematika yang sangat sederhana, tetapi mengapa membuat kode Anda terlihat jelek? Cukup gunakan Math.abs()fungsi yang disediakan Java ! Mereka menyediakannya karena suatu alasan!

Jika Anda benar-benar perlu melewati fungsi tersebut, Anda dapat menggunakan value = (value < 0) ? (-value) : value;, yang merupakan versi kode yang lebih ringkas yang saya sebutkan di bagian logika (3), menggunakan operator Ternary ( ? :) .


Selain itu, mungkin ada situasi di mana Anda ingin selalu mewakili kehilangan atau ketidakhadiran dalam suatu fungsi yang mungkin menerima nilai positif dan negatif.

Alih-alih melakukan beberapa pemeriksaan yang rumit, Anda bisa mendapatkan nilai absolut, dan meniadakannya: negativeValue = (-Math.abs(value));


Dengan mengingat hal itu, dan mempertimbangkan sebuah kasus dengan jumlah beberapa angka seperti milik Anda, merupakan ide bagus untuk mengimplementasikan suatu fungsi:

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

Bergantung pada probabilitas Anda mungkin memerlukan kode terkait lagi, mungkin juga merupakan ide bagus untuk menambahkannya ke pustaka "utils" Anda sendiri, memisahkan fungsi-fungsi tersebut ke dalam komponen inti mereka terlebih dahulu, dan mempertahankan fungsi terakhir hanya sebagai sarang panggilan ke fungsi split-core dari komponen inti:

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

3

Kenapa tidak multiply that number with -1?

Seperti ini:

//Given x as the number, if x is less than 0, return 0 - x, otherwise return x:
return (x <= 0.0F) ? 0.0F - x : x;

2

Jika Anda tertarik pada mekanisme komplemen dua, inilah cara tingkat rendah yang benar-benar tidak efisien, tetapi ilustratif dibuat:

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

Mengapa ini sangat tidak efisien? Saya tidak melihat adanya pengulangan yang membuatnya tidak efisien. Apakah saya melewatkan sesuatu?
aldok

2

Saya akan merekomendasikan solusi berikut:

tanpa kesenangan seksual:

    value = (value*value)/value

(Di atas tidak benar-benar berfungsi.)

dengan menyenangkan lib:

   value = Math.abs(value);

14
bukankan yang pertama menghasilkan angka negatif lagi?
user2875404

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

Kalau tidak:

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

1

Fungsi perpustakaan Math.abs()dapat digunakan.
Math.abs()mengembalikan nilai absolut dari argumen

  • jika argumennya negatif, ia mengembalikan negasi dari argumen itu.
  • jika argumennya positif, ia akan mengembalikan angka apa adanya.

misalnya:

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

Output: 5

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

Output: 6


1

Untuk mengonversi angka negatif ke angka positif (ini disebut nilai absolut), gunakan Math.abs (). Metode Math.abs () ini berfungsi seperti ini

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

Dalam contoh di bawah ini, Math.abs(-1)akan mengkonversi angka negatif 1 ke positif 1.

contoh

public static public void (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);
    
}

Keluaran

Total: 3 Total 2 (nilai absolut): 5


0

Saya membutuhkan nilai absolut yang panjang, dan melihat ke dalam Math.abs dan menemukan bahwa jika argumen saya kurang dari LONG.MIN_VAL yang -9223372036854775808l, maka fungsi abs tidak akan mengembalikan nilai absolut tetapi hanya nilai minimum. Dalam hal ini jika kode Anda menggunakan nilai abs ini lebih lanjut maka mungkin ada masalah.


4
Inti dari Long.MIN_VAL adalah Anda tidak dapat memiliki panjang yang "kurang dari LONG.MIN_VAL".
Paul Tomblin

0

Bisakah Anda mencoba yang ini?

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

4
Pada pertanyaan berusia sepuluh tahun dengan 17 jawaban lain, Anda harus menjelaskan aspek baru dari pertanyaan yang dijawab oleh jawaban Anda. Memulai jawaban dengan pertanyaan adalah cara yang baik untuk menutupnya jika berakhir di antrian ulasan.
Jason Aller


-3

jangan lakukan ini

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

atau

if (number <0) number = -number;

ini akan menjadi bug ketika Anda menjalankan menemukan bug pada kode Anda itu akan melaporkannya sebagai RV_NEGATING_RESULT_OF

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.