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.


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.


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;

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


12

Use a absfunção:

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

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

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!


6

Você está perguntando sobre valores absolutos?

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


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

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.


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

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;

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

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

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

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


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


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.


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.