Rendi positivo un numero negativo


146

Ho un metodo Java in cui sto sommando un insieme di numeri. Tuttavia, desidero che i numeri negativi vengano trattati come positivi. Quindi (1) + (2) + (1) + (- 1) dovrebbe essere uguale a 5.

Sono sicuro che esiste un modo molto semplice per farlo - non so proprio come.



5
Mi stupisce di come tali domande di base ottengano così tanti voti ...
Jose Rui Santos,

Le mie domande sono più ragionevoli di così, ma ha anche molti più voti negativi
nessuno il

Risposte:



103

Il concetto che stai descrivendo si chiama "valore assoluto" e Java ha una funzione chiamata Math.abs per farlo per te. Oppure potresti evitare la chiamata di funzione e farlo da solo:

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

o

if (number < 0)
    number = -number;

21
Oh, tempo del dilemma - ci sono così tante risposte altrettanto buone, che potrei anche cancellare la mia. Ma poi perderei 40 punti e non catturerò mai Jon Skeet se lo faccio.
Paul Tomblin,

3
Ci dispiace -1 per aver reinventato una chiamata in libreria standard.
cletus,

12
@cletus, hai notato che avevo già menzionato la chiamata in libreria standard? O che in questo caso, il "reinventare" richiede meno istruzioni che chiamare la libreria?
Paul Tomblin,

Vale anche la pena comprendere i dettagli dietro la chiamata in biblioteca. Soprattutto se ci sono effetti collaterali nella chiamata in biblioteca o problemi di performance come menziona Paul.
simon,

Anche +1 a causa di @cletus -1. Crei programmatori migliori mostrando sia la migliore soluzione standard a un problema sia ciò che la soluzione sta effettivamente facendo (o qualcosa di simile ad essa).
Francisco Zarabozo,


12

Usa la absfunzione:

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

8

Questo codice non è sicuro per essere chiamato su numeri positivi.

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

3
Possiamo moltiplicare per -1 invece di farlo. Mi sto perdendo qualcosa?
Siva Kranthi Kumar,

7

Prova questo (il negativo davanti a x è valido poiché è un operatore unario, trova di più qui ):

int answer = -x;

Con questo, puoi trasformare un positivo in negativo e un negativo in positivo.


Tuttavia , se si desidera rendere positivo solo un numero negativo, provare questo:

int answer = Math.abs(x);

OPPURE , se preferisci non utilizzare il metodo abs () per qualche motivo, prova questo:

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

Spero che sia d'aiuto! In bocca al lupo!


6

Stai chiedendo valori assoluti?

Math.abs (...) è la funzione che probabilmente desideri.


6

Vuoi racchiudere ogni numero in Math.abs(). per esempio

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

stampa "1".

Se si desidera evitare di scrivere la Math.parte, è possibile includere stat matematicamente. Scrivi e basta

import static java.lang.Math.abs;

insieme alle tue importazioni, e puoi fare riferimento alla funzione abs()semplicemente scrivendo

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

5

Il modo più semplice, se dettagliato, di farlo è avvolgere ogni numero in una chiamata Math.abs (), quindi aggiungere:

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

con modifiche logiche per riflettere la struttura del codice. Verbo, forse, ma fa quello che vuoi.


3
Potresti renderlo meno dettagliato con un'importazione statica.
Dan Dyer,

1
Se avesse il controllo diretto sui valori, non sarebbe meglio rimuovere semplicemente i -segni? O altrimenti, anche se non ha il controllo, non sarebbe meglio usare una funzione come absoluteSum( int[] values ){ /*loop with Math.abs()*/ }invece di racchiudere manualmente Math.abs () in ciascun valore? [-1]
XenoRo l'

Sono d'accordo. Incapsulare la logica in una funzione ben definita renderà questo più chiaro.
Eddie,

5

Quando è necessario rappresentare un valore senza il concetto di perdita o assenza (valore negativo), si parla di "valore assoluto".


La logica per ottenere il valore assoluto è molto semplice: "If it's positive, maintain it. If it's negative, negate it".


Ciò significa che la tua logica e il tuo codice dovrebbero funzionare come segue:

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

Esistono 2 modi per annullare un valore:

  1. Bene, negando il suo valore: value = (-value);
  2. Moltiplicandolo per "100% negativo" o "-1": value = value * (-1);

Entrambi sono in realtà due facce della stessa medaglia. È solo che di solito non ricordi che in value = (-value);realtà lo è value = 1 * (-value);.


Bene, per quanto riguarda il modo in cui lo fai effettivamente in Java, è molto semplice, perché Java fornisce già una funzione per questo, nel Math class:value = Math.abs(value);

Sì, farlo senza Math.abs()è solo una riga di codice con una matematica molto semplice, ma perché rendere brutto il tuo codice? Usa solo Java fornitoMath.abs() funzione ! Lo forniscono per un motivo!

Se hai assolutamente bisogno di saltare la funzione, puoi usare value = (value < 0) ? (-value) : value;, che è semplicemente una versione più compatta del codice che ho citato nella sezione logica (3a), usando l' operatore Ternary ( ? :) .


Inoltre, potrebbero esserci situazioni in cui si desidera rappresentare sempre la perdita o l'assenza all'interno di una funzione che potrebbe ricevere sia valori positivi che negativi.

Invece di fare un controllo complicato, puoi semplicemente ottenere il valore assoluto e negarlo: negativeValue = (-Math.abs(value));


Con questo in mente e considerando un caso con una somma di più numeri come il tuo, sarebbe una buona idea implementare una funzione:

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

A seconda della probabilità che potresti aver bisogno di nuovo del codice correlato, potrebbe anche essere una buona idea aggiungerli alla tua libreria "utils", suddividendo prima tali funzioni nei loro componenti principali e mantenendo la funzione finale semplicemente come un nido di chiamate a le funzioni ora divise dei componenti principali:

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

Perché non lo fai multiply that number with -1?

Come questo:

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

Se sei interessato alla meccanica del complemento a due, ecco il modo assolutamente inefficiente, ma illustrativo di basso livello che viene realizzato:

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

Perché è assolutamente inefficiente? Non vedo alcun loop che lo rende inefficiente. Ho dimenticato qualcosa?
aldok,

2

Consiglierei le seguenti soluzioni:

senza divertimento lib:

    value = (value*value)/value

(Quanto sopra in realtà non funziona.)

con divertimento lib:

   value = Math.abs(value);

14
il primo non darebbe di nuovo un numero negativo?
user2875404,

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

In alternativa:

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

1

Math.abs()È possibile utilizzare la funzione di libreria .
Math.abs()restituisce il valore assoluto dell'argomento

  • se l'argomento è negativo, restituisce la negazione dell'argomento.
  • se l'argomento è positivo, restituisce il numero così com'è.

per esempio:

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

Uscita: 5

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

Uscita: 6


1

Per convertire un numero negativo in un numero positivo (questo è chiamato valore assoluto), utilizza Math.abs (). Questo metodo Math.abs () funziona in questo modo

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

Nell'esempio seguente, Math.abs(-1)il numero negativo 1 verrà convertito in 1 positivo.

esempio

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

Produzione

Totale: 3 Totale 2 (valore assoluto): 5


0

Avevo bisogno del valore assoluto di un lungo e ho analizzato a fondo Math.abs e ho scoperto che se il mio argomento fosse inferiore a LONG.MIN_VAL che è -9223372036854775808l, la funzione abs non restituirebbe un valore assoluto ma solo il valore minimo. In questo caso, se il codice utilizza ulteriormente questo valore abs, potrebbe esserci un problema.


4
L'intero punto di Long.MIN_VAL è che non puoi avere un tempo "inferiore a LONG.MIN_VAL".
Paul Tomblin,

0

Puoi per favore provare questo?

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

4
Su una domanda di dieci anni con altre 17 risposte dovresti spiegare a quale nuovo aspetto della domanda affronta la tua risposta. Iniziare una risposta con una domanda è un buon modo per chiuderla se finisce nelle code di revisione.
Jason Aller,


-3

non farlo

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

o

if (numero <0) numero = -numero;

questo sarà un bug quando esegui trova bug sul tuo codice lo segnalerà come RV_NEGATING_RESULT_OF

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.