为什么我不能在参数中使用一个小于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?

+1

什么是输出?你怎么称呼方法? – 2013-03-10 06:52:24

+1

您必须展示第二个示例中如何计算'param'的值。我敢打赌它是'double param = 1/10;',在这种情况下整数除法正在完成并且结果为零。它在第一个示例中起作用,因为表达式是从左到右进行求值的,并且转换为双精度以正确的顺序进行。 – 2013-03-10 07:01:30

+1

有*得到*是这个问题的一百个重复。 – cHao 2013-03-10 07:08:30

通过调用该方法

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。 这就是为什么第一种情况按照预期在第二种情况下不会发生的原因。

+0

这很有道理。那么,它在第一个例子中没有将零分数评估为零的原因是因为它一次完成所有的程序?如果没有,那么为了让我为这项工作发生了什么? – Magpie 2013-03-10 07:13:19

+1

编辑到我的答案包括为什么第一个案件为你工作的原因!查看。 – codeMan 2013-03-10 07:16:32

+0

似乎有很多事情要注意与Java!感谢您的帮助。 – Magpie 2013-03-10 17:25:31

如果param作为

double param = 0.1;

double param = 1.0d/10.0d;

,而不是

double param = 1/10;

因为在double param = 1/10情况下初始化它会工作得很好被执行,在操作中有两个整数被四舍五入为零并分配给参数。

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