負の数を正にします


146

一連の数値を合計するJavaメソッドがあります。ただし、負の数値はすべて正として扱われるようにします。したがって、(1)+(2)+(1)+(-1)は5になります。

これを行うには非常に簡単な方法があると確信しています-方法がわかりません。



5
このような基本的な質問が多くの賛成票を獲得する方法を私は驚かせます...
ホセルイサントス

私の質問はこれよりも合理的であるが、まだそれはそう多くのdownvotesを持っている
誰も

回答:



103

あなたが説明している概念は「絶対値」と呼ばれ、Javaはあなたのためにそれを行うためにMath.absと呼ばれる関数を持っています。または、関数呼び出しを回避して自分で行うこともできます。

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

または

if (number < 0)
    number = -number;

21
ああ、ジレンマの時間-同様に良い答えがたくさんあるので、私も削除するかもしれません。しかし、それから私は40ポイントを失うでしょう、そしてそれをするなら私はジョンスキートを決して捕まえません。
ポールトンブリン

3
標準ライブラリ呼び出しを再発明して申し訳ありません。
cletus 2009年

12
@cletus、私はすでに標準ライブラリの呼び出しについて述べたことに気づきましたか?または、この場合、「再発明」はライブラリを呼び出すよりも少ない命令をとりますか?
ポールトンブリン

ライブラリ呼び出しの詳細についても理解する価値があります。特に、ライブラリ呼び出しに副作用がある場合、またはPaulが言及するようなパフォーマンスの問題がある場合。
サイモン

@cletus -1のために+1。問題に対する最良の標準ソリューションとそのソリューションが実際に行っていること(またはそれに匹敵するもの)の両方を示すことにより、より優れたプログラマーを作成します。
フランシスコサラボソ2015


12

abs関数を使用します。

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

8

このコードは、正の数で呼び出すの安全ではありません

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

3
これを行う代わりに、-1を掛けることができます。何か不足していますか?
Siva Kranthi Kumar 2018

7

これを試してください(xの前の負は単項演算子なので有効です。詳細はこちらをご覧ください):

int answer = -x;

これにより、ポジティブをネガティブに、ネガティブをポジティブに変えることができます。


ただし、負の数だけを正にしたい場合は、これを試してください:

int answer = Math.abs(x);

または、何らかの理由でabs()メソッドを使用したくない場合は、これを試してください。

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

それが役に立てば幸い!幸運を!


6

絶対値について質問していますか?

Math.abs(...)はおそらく必要な関数です。


6

各数値をにラップしたいとしMath.abs()ます。例えば

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

「1」を出力します。

Math.-partの記述を避けたい場合は、Mathユーティリティを静的に含めることができます。書くだけ

import static java.lang.Math.abs;

あなたのインポートと一緒に、そしてあなたはabs()書くだけで-functionを参照することができます

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

5

これを行うための詳細な方法がMath.abs()呼び出しで各数値をラップすることである場合、最も簡単なので、以下を追加します。

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

コードの構造を反映するようにロジックを変更します。詳細かもしれませんが、それはあなたが望むことをします。


3
静的インポートを使用すると、冗長性を低くすることができます。
Dan Dyer、

1
彼が値を直接制御している場合は、単に-記号を削除する方がよいのではないでしょうか。または、彼が制御を持たない場合も含めて、absoluteSum( int[] values ){ /*loop with Math.abs()*/ }Math.abs()を各値で手動でラップする代わりに、次のような関数を使用するほうがいいのではないでしょうか。[-1]
XenoRo 2013

同意する。適切な名前の関数にロジックをカプセル化すると、これがより明確になります。
エディ

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

値を否定する方法は2つあります。

  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 項演算子(? :を使用して、ロジック(3番目)セクションで説明したコードのよりコンパクトなバージョンです。


さらに、正と負の両方の値を受け取る可能性のある関数内で常に損失または不在を表現したい場合があります。

複雑なチェックを行う代わりに、絶対値を取得してそれを否定することができます。 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));
}


2

2の補数のメカニズムに興味がある場合は、これは完全に非効率的ですが、これを行うための低レベルの方法の例です。

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

なぜ完全に非効率なのですか?非効率的なループは見られません。私は何か見落としてますか?
aldok

2

私は次の解決策をお勧めします:

lib funなし:

    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を深く調べたところ、引数が-9223372036854775808lのLONG.MIN_VALより小さい場合、abs関数は絶対値ではなく最小値のみを返すことがわかりました。この場合、コードがこのabs値をさらに使用していると、問題が発生する可能性があります。


4
Long.MIN_VALの重要な点は、「LONG.MIN_VAL未満」のlongを持つことはできないということです。
ポールトンブリン

0

これを試して頂けますか?

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

4
他の17の回答を含む10年前の質問では、回答が対応する質問の新しい側面を説明する必要があります。質問から回答を開始することは、最終的にレビューキューに入れられた場合にそれをクローズするための良い方法です。
Jason Aller


-3

これをしないでください

数値=(数値<0?-数値:数値);

または

if(number <0)number = -number;

これは、コードでバグの検索を実行するとバグになり、RV_NEGATING_RESULT_OFとして報告されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.