Negatif bir sayıyı pozitif yapın


153

Bir dizi sayıyı topladığım bir Java yöntemim var. Ancak, negatif sayıların pozitif olarak değerlendirilmesini istiyorum. Yani (1) + (2) + (1) + (- 1) 5'e eşit olmalıdır.

Eminim bunu yapmanın çok kolay bir yolu vardır - nasıl yapılacağını bilmiyorum.



6
Bu kadar basit soruların nasıl bu kadar çok olumlu oy aldığı beni şaşırtıyor ...
Jose Rui Santos

1
Sorularım bundan daha mantıklı ama yine de çok daha fazla olumsuz oy var
kimse

Yanıtlar:


377

Math.abs'ı aramanız yeterli . Örneğin:

int x = Math.abs(-5);

Hangi ayarlar xiçin 5.

Geçerseniz Integer.MIN_VALUE, aralığı intpozitif eşdeğerin temsil edilmesine izin vermediğinden, aynı değerin (yine de negatif) döndürüleceğini unutmayın.


44
Uç durumlara dikkat edin, örneğin Math.abs (Integer.MIN_VALUE) = Integer.MIN_VALUE.
Zach Scrivena

((a <= 0.0D)? 0.0D - a: a)
Koekiebox

Bu, için kenar koşulunu kapsamaz Integer.MIN_VALUE. Bu youtu.be/IWrpDP-ad7g
vs_lala

@vs_lala: Evet, bir not eklediniz.
Jon Skeet

105

Tanımladığınız kavrama "mutlak değer" denir ve Java'nın sizin için bunu yapması için Math.abs adında bir işlevi vardır . Ya da işlev çağrısından kaçınabilir ve kendiniz yapabilirsiniz:

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

veya

if (number < 0)
    number = -number;

22
Oh, ikilem zamanı - o kadar çok eşit derecede iyi cevap var ki benimkini de silebilirim. Ama sonra 40 puan kaybederim ve bunu yaparsam Jon Skeet'i asla yakalayamam.
Paul Tomblin

3
Standart bir kütüphane çağrısını yeniden icat ettiğim için üzgünüm -1.
cletus

12
@cletus, standart kütüphane çağrısından daha önce bahsettiğimi fark ettin mi? Veya bu durumda, "yeniden icat" kitaplığı çağırmaktan daha az talimat alır mı?
Paul Tomblin

Ayrıca kütüphane çağrısının ardındaki ayrıntıları anlamaya değer. Özellikle kütüphane çağrısının yan etkileri veya Paul'ün bahsettiği gibi performans sorunları varsa.
simon

Ayrıca @cletus -1 nedeniyle +1. Hem bir probleme en iyi standart çözümü hem de bu çözümün gerçekte ne yaptığını (veya onunla karşılaştırılabilir bir şeyi) göstererek daha iyi programcılar yaratırsınız.
Francisco Zarabozo


12

Şu absişlevi kullanın :

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

8

Bu kodun pozitif sayılarda çağrılması güvenli değildir .

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

3
Bunu yapmak yerine -1 ile çarpabiliriz. Bir şey mi kaçırıyorum?
Siva Kranthi Kumar

7

Bunu deneyin (x'in önündeki negatif, tekli bir operatör olduğu için geçerlidir, daha fazlasını burada bulabilirsiniz ):

int answer = -x;

Bununla, olumludan olumsuza ve olumsuzdan olumluya dönüştürebilirsiniz.


Ancak , yalnızca negatif bir sayıyı pozitif yapmak istiyorsanız, şunu deneyin:

int answer = Math.abs(x);

VEYA , herhangi bir nedenle abs () yöntemini kullanmamayı tercih ederseniz, şunu deneyin:

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

Umarım yardımcı olur! İyi şanslar!


6

Mutlak değerler hakkında mı soruyorsunuz?

Math.abs (...) muhtemelen isteyeceğiniz işlevdir.


6

Her sayıyı içine almak istiyorsunuz Math.abs(). Örneğin

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

"1" yazdırır.

Math.-Part'ı yazmaktan kaçınmak istiyorsanız, Math'ı statik olarak dahil edebilirsiniz. Sadece yaz

import static java.lang.Math.abs;

ithalatlarınızla birlikte, abs()-işlevine sadece yazarak başvurabilirsiniz

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

5

Bunu yapmanın en kolay, ayrıntılı yolu, her sayıyı bir Math.abs () çağrısına kaydırmaktır, böylece ekleyeceksiniz:

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

kodunuzun nasıl yapılandırıldığını yansıtmak için mantık değişiklikleri ile. Ayrıntılı, belki, ama istediğinizi yapıyor.


3
Statik bir içe aktarmayla onu daha az ayrıntılı hale getirebilirsiniz.
Dan Dyer

1
Değerler üzerinde doğrudan kontrolü varsa, basitçe -işaret (ler) i kaldırmak daha iyi olmaz mıydı ? Ya da başka türlü, kontrole sahip olmaması da dahil olmak üzere, absoluteSum( int[] values ){ /*loop with Math.abs()*/ }Math.abs () 'ı her bir değere manuel olarak sarmak yerine bir işlev kullanmak daha iyi olmaz mıydı ? [-1]
XenoRo

Katılıyorum. Mantığı iyi adlandırılmış bir işlevle sarmalamak, bunu daha açık hale getirecektir.
Eddie

5

Kayıp veya yokluk (negatif değer) kavramı olmadan bir değeri temsil etmeniz gerektiğinde, buna "mutlak değer" denir.


Mutlak değer elde etmek mantık çok basit: "If it's positive, maintain it. If it's negative, negate it".


Bunun anlamı, mantığınızın ve kodunuzun aşağıdaki gibi çalışması gerektiğidir:

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

Bir değeri reddetmenin 2 yolu vardır:

  1. Şey, değerini yadsıyarak: value = (-value);
  2. "% 100 negatif" veya "-1" ile çarparak: value = value * (-1);

Her ikisi de aslında aynı madalyonun iki yüzüdür. Sadece bunun value = (-value);aslında aslında olduğunu genellikle hatırlamazsınız value = 1 * (-value);.


Peki, Java'da bunu gerçekte nasıl yaptığınıza gelince, çok basit, çünkü Java zaten bunun için bir işlev sağlıyor Math class:value = Math.abs(value);

Evet, bunu olmadan Math.abs()yapmak çok basit matematik içeren bir kod satırıdır, ama neden kodunuzu çirkin gösteriyorsunuz? Sadece Java'nın sağladığı Math.abs()işlevi kullanın ! Bunu bir sebeple sağlıyorlar!

Fonksiyonu kesinlikle atlamanız gerekiyorsa value = (value < 0) ? (-value) : value;, Ternary operatörünü ( ? :) kullanarak mantık (3.) bölümünde bahsettiğim kodun basitçe daha kompakt bir versiyonu olan kullanabilirsiniz .


Ek olarak, hem pozitif hem de negatif değerler alabilecek bir işlevde her zaman kaybı veya yokluğu temsil etmek istediğiniz durumlar olabilir.

Karmaşık bir kontrol yapmak yerine, sadece mutlak değeri elde edebilir ve reddedebilirsiniz: negativeValue = (-Math.abs(value));


Bunu akılda tutarak ve sizinki gibi birden çok sayının toplamı olan bir durumu göz önünde bulundurarak, bir işlevi uygulamak iyi bir fikir olacaktır:

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

İlgili koda tekrar ihtiyaç duyma olasılığınıza bağlı olarak, bunları kendi "utils" kitaplığınıza eklemek, bu tür işlevleri önce çekirdek bileşenlerine ayırmak ve son işlevi yalnızca çağrıların yuvası olarak sürdürmek iyi bir fikir olabilir. çekirdek bileşenlerin artık bölünmüş işlevleri:

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

Neden değil mi multiply that number with -1?

Bunun gibi:

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

Eğer ikinin tamamlayıcısının mekaniğiyle ilgileniyorsanız, işte kesinlikle verimsiz, ancak açıklayıcı düşük seviyeli yol bu yapılır:

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

Neden kesinlikle verimsiz? Verimsiz kılan herhangi bir döngü görmüyorum. Bir şey mi kaçırdım?
aldok

2

Aşağıdaki çözümleri tavsiye ederim:

lib eğlencesi olmadan:

    value = (value*value)/value

(Yukarıdakiler aslında çalışmaz.)

lib eğlencesi ile:

   value = Math.abs(value);

14
İlki yine negatif bir sayı ile sonuçlanmaz mı?
user2875404

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

Alternatif olarak:

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

1

Kitaplık işlevi Math.abs()kullanılabilir.
Math.abs()bağımsız değişkenin mutlak değerini verir

  • bağımsız değişken negatifse, bağımsız değişkenin olumsuzlamasını döndürür.
  • bağımsız değişken pozitifse sayıyı olduğu gibi döndürür.

Örneğin:

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

Çıktı: 5

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

Çıktı: 6


1

Negatif sayıyı pozitif sayıya dönüştürmek için (buna mutlak değer denir) Math.abs () kullanılır. Bu Math.abs () yöntemi şu şekilde çalışır

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

Aşağıdaki örnekte, Math.abs(-1)negatif 1 sayısı pozitif 1'e dönüştürülecektir.

misal

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

Çıktı

Toplam: 3 Toplam 2 (mutlak değer): 5


0

Long'un mutlak değerine ihtiyacım vardı ve Math.abs'a derinlemesine baktım ve argümanım -9223372036854775808l olan LONG.MIN_VAL'den küçükse, abs işlevinin mutlak bir değer değil, yalnızca minimum değer döndürdüğünü gördüm. Bu durumda, kodunuz bu abs değerini daha fazla kullanıyorsa, bir sorun olabilir.


4
Long.MIN_VAL'ın tüm amacı, "LONG.MIN_VAL'den daha az" olan bir uzunluğa sahip olamayacağınızdır.
Paul Tomblin

0

Lütfen bunu deneyebilir misin?

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

4
Başka 17 yanıtı olan on yıllık bir soruda, yanıtınızın hangi yeni yönünü ele aldığını açıklamanız gerekir. Bir yanıta soru ile başlamak, soru inceleme kuyruklarında biterse, yanıtın kapatılması için iyi bir yoldur.
Jason Aller

bu doğru değil. -1 = 0xFFFFFFFF, sonra -0xFFFFFFFF & 0x7FFFFFFF = 0x7FFFFFFFFF, bu 1'den farklıdır. Beklendiği gibi, negatif sayı için ikili tam sayı biçimi 2'ye tamamlayıcıdır, bu nedenle bu doğru olamaz.
2LayerNN300HU


0
if(arr[i]<0)

Math.abs(arr[i]);  //1st way (taking absolute value)

arr[i]=-(arr[i]); //2nd way (taking -ve of -ve no. yields a +ve no.)

arr[i]= ~(arr[i]-1);   //3rd way (taking negation)

0

Görüyorum ki insanlar bunu söylüyor Math.abs(number)ama bu yöntem tam bir kanıt değil.

Sarmaya çalıştığınızda bu başarısız olur Math.abs(Integer.MIN_VALUE)(bkz. Ref. Https://youtu.be/IWrpDP-ad7g )

Integer.MIN_VALUEGirdiyi alıp almayacağınızdan emin değilseniz . Her zaman bu numarayı kontrol etmeniz ve manuel olarak kullanmanız önerilir.


-3

bunu yapma

sayı = (sayı <0? -sayı: sayı);

veya

eğer (sayı <0) sayı = -sayı;

kodunuzda bul hatası çalıştırdığınızda bu bir hata olacak ve bunu RV_NEGATING_RESULT_OF olarak rapor edecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.