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

两种方法都编译得很好,但是当我尝试运行第二种方法时,它会使第一列中的所有数据 = 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;  

在 param() 中相当于

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

这就是为什么它在第二种情况下使第一列中的所有数据 = 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. 这就是为什么第一种情况可以按您的预期工作,而第二种情况则不能。

于 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/10when1/10执行的情况下,操作中使用了两个整数,它们被四舍五入为零并分配给 param。

它在您发布的第一种方法中运行良好,因为表达式是从左到右计算的,因为两者都*具有/相同的算术运算符优先级。

于 2013-03-10T07:07:30.700 回答