Сделайте отрицательное число положительным

146

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

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

Лоток
источник
простая математика stackoverflow.com/a/5220597/185022 :)
AZ_
5
Меня поражает, как такие простые вопросы вызывают столько голосов ...
Хосе Руи Сантос
Мои вопросы являются более разумными , чем это , но все же он так больше downvotes
Noone

Ответы:

366

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

int x = Math.abs(-5);

Который будет установлен xв 5.

Джон Скит
источник
42
Обратите внимание на крайние случаи, например, Math.abs (Integer.MIN_VALUE) = Integer.MIN_VALUE.
Зак Скривена
((a <= 0.0D)? 0.0D - a: a)
Koekiebox
103

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

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

или

if (number < 0)
    number = -number;
Пол Томблин
источник
21
О, время дилеммы - есть так много одинаково хороших ответов, что я мог бы также удалить свой. Но тогда я потеряю 40 очков и никогда не поймаю Джона Скита, если сделаю это.
Пол Томблин
3
Извините -1 за повторное изобретение стандартного библиотечного вызова.
Клет
12
@cletus, вы заметили, что я уже упомянул стандартный вызов библиотеки? Или что в этом случае «переизобретать» требует меньше инструкций, чем вызов библиотеки?
Пол Томблин
Также стоит разобраться в деталях библиотеки. Особенно, если есть побочные эффекты при вызове библиотеки или проблемы с производительностью, как упоминает Пол.
Симон
Также +1 из-за @cletus -1. Вы создаете лучших программистов, показывая как лучшее стандартное решение проблемы, так и то, что на самом деле делает это решение (или что-то сравнимое с ним).
Франциско Сарабосо
19

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

Теория шестиугольника
источник
12

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

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);
jpalecek
источник
8

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

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20
AZ_
источник
3
Мы можем умножить на -1 вместо этого. Я что-то упустил?
Шива Кранти Кумар,
7

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

int answer = -x;

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


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

int answer = Math.abs(x);

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

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

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

Шрешт Харбанда
источник
6

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

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

Uri
источник
6

Вы хотите обернуть каждый номер в Math.abs(). например

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

распечатывает «1».

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

import static java.lang.Math.abs;

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

System.out.println(abs(-1));
Хенрик Пол
источник
5

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

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

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

Эдди
источник
3
Вы можете сделать его менее подробным с помощью статического импорта.
Дэн Дайер
1
Если он имеет прямой контроль над значениями, не лучше ли просто удалить -знак (ы)? Или иначе, в том числе, если у него нет контроля, не лучше ли использовать такую ​​функцию, как absoluteSum( int[] values ){ /*loop with Math.abs()*/ }вместо ручной обертки Math.abs () в каждом значении? [-1]
XenoRo
Я согласен. Инкапсуляция логики в хорошо названной функции сделает это более понятным.
Эдди
5

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


Логика , чтобы получить абсолютное значение очень просто: "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()- просто строка кода с очень простой математикой, но зачем делать ваш код уродливым? Просто используйте Math.abs()функцию Java ! Они предоставляют это по причине!

Если вам абсолютно необходимо пропустить функцию, вы можете использовать ее 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));
}
XenoRo
источник
3

Почему не ты multiply that number with -1?

Как это:

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

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

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}
Микель
источник
Почему это абсолютно неэффективно? Я не вижу циклов, которые делают его неэффективным. Я что-то пропустил?
Алдок
2

Я бы порекомендовал следующие решения:

без веселья

    value = (value*value)/value

(Выше не работает.)

с lib fun:

   value = Math.abs(value);
Саидеш Килару
источник
14
не приведет ли первый к отрицательному числу снова?
user2875404
1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

В качестве альтернативы:

int i = -123;
System.out.println(Math.abs(i));
Рамкумар
источник
1

Библиотечная функция Math.abs()может быть использована.
Math.abs()возвращает абсолютное значение аргумента

  • если аргумент отрицательный, он возвращает отрицание аргумента.
  • если аргумент положительный, он возвращает число как есть.

например:

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

Выход: 5

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

Выход: 6

Ямуна Эррагунтла
источник
1

Чтобы преобразовать отрицательное число в положительное число (это называется абсолютным значением), используется Math.abs (). Этот метод Math.abs () работает следующим образом

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

В приведенном ниже примере, Math.abs(-1)будет преобразовывать отрицательное число 1 в положительное 1.

пример

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

Вывод

Всего: 3 Всего 2 (абсолютное значение): 5

Пранав М.С.
источник
0

Мне нужно было абсолютное значение long, и я внимательно изучил Math.abs и обнаружил, что если мой аргумент меньше LONG.MIN_VAL, который равен -9223372036854775808l, то функция abs не будет возвращать абсолютное значение, а только минимальное значение. В этом случае, если ваш код использует это значение abs дальше, то это может быть проблемой.

Santhosh
источник
4
Смысл Long.MIN_VAL в том, что вы не можете иметь длинное, которое «меньше, чем LONG.MIN_VAL».
Пол Томблин
0

Можете ли вы попробовать это?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}
Кумаресан П
источник
4
На 10-летний вопрос с 17 другими ответами вы должны объяснить, к какому новому аспекту вопроса относится ваш ответ. Начинать ответ с вопроса - это хороший способ закрыть его, если он окажется в очередях просмотра.
Джейсон Аллер
-3

не делай этого

число = (число <0? -номер: число);

или

if (число <0) число = -номер;

это будет ошибка, когда вы запустите поиск ошибки в вашем коде, он сообщит об этом как RV_NEGATING_RESULT_OF

Сай Горантла
источник