Сделайте отрицательное число положительным - PullRequest
127 голосов
/ 30 января 2009

У меня есть метод Java, в котором я суммирую набор чисел. Тем не менее, я хочу, чтобы любые отрицательные числа рассматривались как положительные. Так что (1) + (2) + (1) + (- 1) должно быть равно 5.

Я уверен, что есть очень простой способ сделать это - я просто не знаю, как.

Ответы [ 17 ]

336 голосов
/ 30 января 2009

Просто позвоните Math.abs . Например:

int x = Math.abs(-5);

Что будет устанавливать x на 5.

99 голосов
/ 30 января 2009

Концепция, которую вы описываете, называется «абсолютной величиной», и в Java есть функция с именем Math.abs , которая сделает это за вас. Или вы можете избежать вызова функции и сделать это самостоятельно:

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

или

if (number < 0)
    number = -number;
18 голосов
/ 30 января 2009

Вы ищете абсолютное значение, приятель. Math.abs(-5) возвращает 5 ...

12 голосов
/ 30 января 2009

Используйте функцию abs:

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);
8 голосов
/ 07 марта 2011

Этот код не безопасен для вызова на положительных числах.

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20
6 голосов
/ 30 января 2009

Вы спрашиваете об абсолютных значениях?

Math.abs (...) - это функция, которую вы, вероятно, хотите.

6 голосов
/ 30 января 2009

Вы хотите заключить каждое число в Math.abs(). например,

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

выводит "1".

Если вы хотите избежать написания Math. -части, вы можете включить Math util статически. Просто напишите

import static java.lang.Math.abs;

вместе с вашим импортом, и вы можете обратиться к abs() -функции просто написав

System.out.println(abs(-1));
5 голосов
/ 09 октября 2016

Попробуйте это (отрицательный знак перед x действителен, поскольку это унарный оператор, найдите больше здесь ):

int answer = -x;

При этом вы можете превратить позитив в негатив и негатив в позитив.


Однако , если вы хотите сделать только отрицательное число положительным, попробуйте следующее:

int answer = Math.abs(x);

ИЛИ , если вы по какой-то причине предпочитаете не использовать метод abs (), попробуйте следующее:

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

Надеюсь, это поможет! Удачи!

5 голосов
/ 11 сентября 2013

Когда вам нужно представить значение без понятия потери или отсутствия (отрицательное значение), это называется «абсолютное значение».


Логика получения абсолютного значения очень проста: "If it's positive, maintain it. If it's negative, negate it".


Это означает, что ваша логика и код должны работать следующим образом:

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

Есть два способа отменить значение:

  1. Ну, отрицая это значение: value = (-value);
  2. Умножив его на «100% отрицательный» или «-1»: value = value * (-1);

Обе они на самом деле две стороны одной медали. Просто вы обычно не помните, что value = (-value); на самом деле value = 1 * (-value);.


Что касается того, как вы на самом деле делаете это в Java, то это очень просто, потому что Java уже предоставляет функцию для этого в Math class: value = Math.abs(value);

Да, делать это без Math.abs() - это просто строка кода с очень простой математикой, но зачем делать ваш код уродливым? Просто используйте функцию Java Math.abs()! Они предоставляют это по причине!

Если вам абсолютно необходимо пропустить функцию, вы можете использовать value = (value < 0) ? (-value) : value;, который является просто более компактной версией кода, который я упомянул в разделе логики (3-й), с использованием оператора Ternary (? :) ) .


Кроме того, могут быть ситуации, когда вы хотите всегда представлять потерю или отсутствие в функции, которая может принимать как положительные, так и отрицательные значения.

Вместо какой-то сложной проверки вы можете просто получить абсолютное значение и опровергнуть его: negativeValue = (-Math.abs(value));


Имея это в виду и учитывая случай с суммой нескольких чисел, таких как ваше, было бы неплохо реализовать функцию:

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

В зависимости от вероятности, что вам может понадобиться снова связанный код, также может быть хорошей идеей добавить их в вашу собственную библиотеку «utils», сначала разбить такие функции на их основные компоненты и поддерживать конечную функцию просто как гнездо. вызовов к теперь разделенным функциям основных компонентов:

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));
}
5 голосов
/ 30 января 2009

Самый простой, если многословный способ сделать это, - обернуть каждое число в вызове Math.abs (), поэтому вы должны добавить:

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

с изменениями логики, отражающими структуру вашего кода. Возможно, многословно, но оно делает то, что вы хотите.

...