Tornar um número negativo positivo

146

Eu tenho um método Java no qual estou somando um conjunto de números. No entanto, quero que quaisquer números negativos sejam tratados como positivos. Então (1) + (2) + (1) + (- 1) deve ser igual a 5.

Tenho certeza de que há uma maneira muito fácil de fazer isso - simplesmente não sei como.

Bandeja
fonte
matemática simples stackoverflow.com/a/5220597/185022 :)
AZ_
5
Espanta-me como tais questões básicas que recebo tantos upvotes ...
José Rui Santos
Minhas perguntas são mais razoável do que isso, mas ainda tem de modo mais downvotes
ninguém

Respostas:

366

Basta ligar para Math.abs . Por exemplo:

int x = Math.abs(-5);

Qual será definido xcomo 5.

Jon Skeet
fonte
42
Observe os casos extremos, por exemplo, Math.abs (Integer.MIN_VALUE) = Integer.MIN_VALUE.
Zach Scrivena
((a <= 0.0D)? 0.0D - a: a) #
284 Koekiebox
103

O conceito que você está descrevendo é chamado de "valor absoluto" e o Java tem uma função chamada Math.abs para fazer isso por você. Ou você pode evitar a chamada de função e fazer você mesmo:

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

ou

if (number < 0)
    number = -number;
Paul Tomblin
fonte
21
Ah, tempo de dilema - há tantas respostas igualmente boas que é melhor excluir as minhas. Mas então eu perderia 40 pontos e nunca pegarei Jon Skeet se fizer isso.
Paul Tomblin
3
Desculpe -1 por reinventar uma chamada de biblioteca padrão.
Cletus
12
@cletus, você notou que eu já havia mencionado a chamada de biblioteca padrão? Ou que, nesse caso, o "reinventar" requer menos instruções do que chamar a biblioteca?
Paul Tomblin 30/01/09
Também vale a pena entender os detalhes por trás da chamada da biblioteca. Especialmente se houver efeitos colaterais na chamada da biblioteca ou problemas de desempenho como Paul menciona.
simon
Também +1 por causa de @cletus -1. Você cria melhores programadores, mostrando a melhor solução padrão para um problema E o que essa solução está realmente fazendo (ou algo comparável a ela).
Francisco Zarabozo 29/04
19

Você está procurando por valor absoluto, companheiro. Math.abs(-5)retorna 5 ...

Teoria do Hexágono
fonte
12

Use a absfunção:

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

Este código não é seguro para ser chamado em números positivos.

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20
AZ_
fonte
3
Podemos multiplicar com -1 em vez de fazer isso. Estou faltando alguma coisa?
Siva Kranthi Kumar
7

Tente isso (o negativo na frente do x é válido, pois é um operador unário, encontre mais aqui ):

int answer = -x;

Com isso, você pode transformar um positivo em negativo e um negativo em positivo.


No entanto , se você deseja apenas tornar positivo um número negativo, tente o seguinte:

int answer = Math.abs(x);

OU , se você preferir não usar o método abs () por algum motivo, tente o seguinte:

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

Espero que ajude! Boa sorte!

Shreshth Kharbanda
fonte
6

Você está perguntando sobre valores absolutos?

Math.abs (...) é a função que você provavelmente deseja.

Uri
fonte
6

Você deseja agrupar cada número Math.abs(). por exemplo

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

imprime "1".

Se você deseja evitar escrever a Math.parte, pode incluir estaticamente o utilitário Math. Apenas escreva

import static java.lang.Math.abs;

junto com suas importações, e você pode consultar a abs()função apenas escrevendo

System.out.println(abs(-1));
Henrik Paul
fonte
5

A maneira mais fácil, se detalhada, de fazer isso é agrupar cada número em uma chamada Math.abs (); portanto, você deve adicionar:

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

com alterações lógicas para refletir como seu código está estruturado. Detalhado, talvez, mas faz o que você deseja.

Eddie
fonte
3
Você poderia torná-lo menos detalhado com uma importação estática.
Dan Dyer
1
Se ele tem controle direto sobre os valores, não seria melhor simplesmente remover os -sinais? Ou, caso contrário, inclusive se ele não tiver controle, não seria melhor usar uma função como, em absoluteSum( int[] values ){ /*loop with Math.abs()*/ }vez de agrupar manualmente Math.abs () em cada valor? [-1]
XenoRo 11/09/13
Concordo. Encapsular a lógica em uma função bem nomeada tornará isso mais claro.
Eddie
5

Quando você precisa representar um valor sem o conceito de perda ou ausência (valor negativo), isso é chamado de "valor absoluto".


A lógica para obter o valor absoluto é muito simples: "If it's positive, maintain it. If it's negative, negate it".


O que isso significa é que sua lógica e código devem funcionar da seguinte maneira:

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

Existem duas maneiras de negar um valor:

  1. Negando seu valor: value = (-value);
  2. Ao multiplicá-lo por "100% negativo" ou "-1": value = value * (-1);

Ambos são na verdade dois lados da mesma moeda. É que você geralmente não se lembra que value = (-value);é realmente value = 1 * (-value);.


Bem, sobre como você realmente faz isso em Java, é muito simples, porque Java já fornece uma função para isso, no Math class:value = Math.abs(value);

Sim, fazê-lo sem Math.abs()é apenas uma linha de código com uma matemática muito simples, mas por que tornar seu código feio? Basta usar a Math.abs()função fornecida pelo Java ! Eles fornecem isso por uma razão!

Se você absolutamente precisar pular a função, poderá usar value = (value < 0) ? (-value) : value;, que é simplesmente uma versão mais compacta do código que mencionei na seção lógica (3), usando o operador Ternary ( ? :) .


Além disso, pode haver situações em que você sempre queira representar perda ou ausência em uma função que possa receber valores positivos e negativos.

Em vez de fazer uma verificação complicada, você pode simplesmente obter o valor absoluto e negá-lo: negativeValue = (-Math.abs(value));


Com isso em mente, e considerando um caso com uma soma de vários números como o seu, seria uma boa idéia implementar uma função:

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

Dependendo da probabilidade de você precisar do código relacionado novamente, também pode ser uma boa ideia adicioná-los à sua própria biblioteca "utils", dividindo essas funções em seus componentes principais primeiro e mantendo a função final simplesmente como um ninho de chamadas para as funções agora divididas dos componentes principais:

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));
}
XenoRo
fonte
3

Por que não você multiply that number with -1?

Como isso:

//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;
Muhammad Imran Tariq
fonte
2

Se você está interessado na mecânica do complemento de dois, aqui está a maneira absolutamente ineficiente, mas ilustrativa, de baixo nível:

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}
Miquel
fonte
Por que é absolutamente ineficiente? Não vejo nenhum loop que o torne ineficiente. Perdi alguma coisa?
Aldok 25/12/19
2

Eu recomendaria as seguintes soluções:

sem diversão divertida:

    value = (value*value)/value

(Na verdade, o acima não funciona.)

com lib diversão:

   value = Math.abs(value);
saidesh kilaru
fonte
14
o primeiro não resultaria em um número negativo novamente?
user2875404
1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

Alternativamente:

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

A função de biblioteca Math.abs()pode ser usada.
Math.abs()retorna o valor absoluto do argumento

  • se o argumento for negativo, ele retornará a negação do argumento.
  • se o argumento for positivo, ele retornará o número como está.

por exemplo:

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

Saída: 5

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

Saída: 6

Yamuna Erraguntla
fonte
1

Para converter número negativo em número positivo (isso é chamado de valor absoluto), usa Math.abs (). Esse método Math.abs () funciona assim

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

No exemplo abaixo, Math.abs(-1)irá converter o número negativo 1 em positivo 1.

exemplo

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

Resultado

Total: 3 Total 2 (valor absoluto): 5

Pranav MS
fonte
0

Eu precisava do valor absoluto de um longo e analisei profundamente o Math.abs e descobri que, se meu argumento for menor que LONG.MIN_VAL que é -9223372036854775808l, a função abs não retornará um valor absoluto, mas apenas o valor mínimo. Nesse caso, se o seu código estiver usando esse valor abs ainda mais, pode haver um problema.

Santhosh
fonte
4
O ponto principal de Long.MIN_VAL é que você não pode ter um longo "inferior a LONG.MIN_VAL".
Paul Tomblin
0

Você pode tentar este?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}
Kumaresan P
fonte
4
Em uma pergunta de dez anos com 17 outras respostas, você deve explicar o novo aspecto da pergunta que sua resposta aborda. Iniciar uma resposta com uma pergunta é uma boa maneira de fechá-la se ela terminar nas filas de revisão.
18719 Jason Aller
-3

não faça isso

número = (número <0? -número: número);

ou

if (número <0) número = -número;

isso será um erro quando você executar o comando find bug no seu código, ele será reportado como RV_NEGATING_RESULT_OF

sai Gorantla
fonte