1. ホーム
  2. java

[解決済み] javaで平均値を計算する

2022-03-15 02:27:38

質問

EDIT: 平均値のためのコードを書きましたが、どのようにすれば int を、私の args.length を配列ではなく

計算できるjavaプログラムを書きたいのですが。

  1. 読み込んだ整数の個数
  2. 平均値 - 整数である必要はない!

注意: 配列から平均値を計算したいのではなく、配列の中の整数を計算したいのです。 args .

現在、私はこのように書いています。

int count = 0;
for (int i = 0; i<args.length -1; ++i)
    count++;
    System.out.println(count);
}
    
int nums[] = new int[] { 23, 1, 5, 78, 22, 4};
double result = 0; //average will have decimal point
for(int i=0; i < nums.length; i++){
    result += nums[i];
}
System.out.println(result/count)

どなたか正しい方向に導いてください。または、このコードを形成するための正しい方法で私を導く例を与える?

よろしくお願いします。

どのように解決するのですか?

あなたのコードを少し修正するだけです(わかりやすくするために変数名を変えています)。

double sum = 0; //average will have decimal point

for(int i=0; i < args.length; i++){
   //parse string to double, note that this might fail if you encounter a non-numeric string
   //Note that we could also do Integer.valueOf( args[i] ) but this is more flexible
   sum += Double.valueOf( args[i] ); 
}

double average = sum/args.length;

System.out.println(average );

なお、ループは簡略化することも可能です。

for(String arg : args){
   sum += Double.valueOf( arg );
}

編集: OP は args の配列があります。これは文字列配列のようなので、それに合わせて回答を更新しました。

更新情報 :

zoxqojが正しく指摘しているように、上記のコードでは整数/倍数のオーバーフローはケアされていません。入力値は十分に小さいのでこの問題はないと思いますが、本当に大きな入力値の場合に使用するスニペットを以下に示します。

BigDecimal sum = BigDecimal.ZERO;
for(String arg : args){
  sum = sum.add( new BigDecimal( arg ) );
}

この方法にはいくつかの利点があります(多少遅くなるので、タイムクリティカルな操作には使わないでください)。

  • 精度が保たれる。doubleでは、計算回数が増えるにつれて精度が徐々に落ちていく(数字によっては正確な精度が得られないこともある)。
  • オーバーフローの可能性はほとんどありません。ただし BigDecimal に収まるサイズより大きいかもしれません。 double または long .