为什么我不能在参数中使用小于0的数字来对双重java进行参数化?

时间:2013-03-10 06:50:27

标签: java double

为什么这样做:

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?

2 个答案:

答案 0 :(得分:2)

通过调用方法

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

as

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,因为语句:

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。 这就是为什么第一种情况可以按预期工作,而第二种情况则不然。

答案 1 :(得分:1)

如果将param初始化为

,它会正常工作

double param = 0.1;

double param = 1.0d/10.0d;

而不是

double param = 1/10;

因为在double param = 1/10情况下执行1/10时,在操作中使用了两个整数,它们四舍五入为零并分配给参数。

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