为什么这样做:
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?
答案 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
时,在操作中使用了两个整数,它们四舍五入为零并分配给参数。
它在您发布的第一个方法中运行正常,因为表达式是从左到右计算的,因为*
和/
具有相同的算术运算符优先级。