为什么我不能在参数中使用一个小于0的数字来参数化一个双java?
为什么这项工作:为什么我不能在参数中使用一个小于0的数字来参数化一个双java?
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
两种方法编译正常,但当我尝试运行第二个它使第一个c中的所有数据olumn = 0
他们都被称为以同样的方式,唯一的区别是,一个从参数得到1/10值,另一方面,它是硬编码到(不理想,但它是我能的唯一途径让它工作一些莫名其妙的原因)。
发生这个问题是因为它不喜欢被数字参数< 0?
通过调用该方法
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
。 这就是为什么第一种情况按照预期在第二种情况下不会发生的原因。
如果param
作为
double param = 0.1;
或
double param = 1.0d/10.0d;
,而不是
double param = 1/10;
因为在double param = 1/10
情况下初始化它会工作得很好被执行,在操作中有两个整数被四舍五入为零并分配给参数。
它在您发布的第一种方法中正常工作,因为表达式是从左到右计算的,因为*
和/
具有相同的算术运算符优先级。
什么是输出?你怎么称呼方法? – 2013-03-10 06:52:24
您必须展示第二个示例中如何计算'param'的值。我敢打赌它是'double param = 1/10;',在这种情况下整数除法正在完成并且结果为零。它在第一个示例中起作用,因为表达式是从左到右进行求值的,并且转换为双精度以正确的顺序进行。 – 2013-03-10 07:01:30
有*得到*是这个问题的一百个重复。 – cHao 2013-03-10 07:08:30