2

なぜこれが機能するのですか:

public static double[][] param(double[][] data){
    for (int i=0;i<data.length;i++){
      for (int j=0;j<data[0].length;j++){
            if(j!=1){
           data[i][j] = data[i][j] * 1/10;//for some reason didn't accept as argument           

            }
            System.out.println(data[i][j]);
      }
    }
    return data;
}

次の出力で:

13581.0 337.42900390625 13571.0 337.1949951171875 13561.0 336.59599609375 13541.0 336.356005859375 13531.0 336.072998046875 13521.0 335.7989990234375 13511.0 335.5219970703125 13501.0

しかし、これはしません:

public static double[][] param(double[][] data, double param){

    for (int i=0;i<data.length;i++){
      for (int j=0;j<data[0].length;j++){
            if(j!=1){
           data[i][j] = data[i][j] * param;            

            }
            System.out.println(data[i][j]);
      }
    }
    return data;
}

次の(間違った)出力があります。

13581.0 0.0 13571.0 0.0 13561.0 0.0 13541.0 0.0 13531.0 0.0 13521.0 0.0 13511.0 0.0 13501.0

どちらの方法も正常にコンパイルされますが、2 番目の方法を実行しようとすると、最初の列のすべてのデータが 0 になります。

どちらも同じ方法で呼び出されています。唯一の違いは、一方が引数から 1/10 の値を取得し、もう一方がハードコードされていることです (理想的ではありませんが、説明できない理由で動作させることができる唯一の方法です) )。

この問題は、数値 < 0 でパラメータ化されるのを好まないために発生していますか?

4

2 に答える 2

2

メソッドを呼び出すことによって

public static double[][] param(double[][] data, double param)

なので

param(data, 1/10);

整数除算により値 1/10 が評価される0 ため、上記のメソッド呼び出しは次と同じです

param(data, 0);

声明

data[i][j] = data[i][j] * param;  

in param() は次と同等です

data[i][j] = data[i][j] * 0 /*`param`*/;  

これが、2 番目のケースで最初の列のすべてのデータを 0 にする理由です。

最初のケースのように、最初の列のデータを作成しません = 0 ステートメントのため:

data[i][j] = data[i][j] * 1/10;

次のように同等に変換されます

data[i][j] = (data[i][j] * 1)/10;// the (data[i][j] * 1) will return a double value

double/int操作が完了すると、結果は になりますdouble。そのため、最初のケースは期待どおりに機能しますが、2 番目のケースはそうではありません。

于 2013-03-10T07:04:15.040 に答える
1

paramとして初期化されている場合、正常に動作します

double param = 0.1; また

double param = 1.0d/10.0d;

それ以外の

double param = 1/10;

double param = 1/10when が実行される場合、1/10操作で使用される 2 つの整数がゼロに丸められ、param に割り当てられるためです。

式は左から右に計算され、算術演算子の優先度が同じであるため、投稿された最初の方法で正常に機能しまし*/

于 2013-03-10T07:07:30.700 に答える