Java:计算错误答案,我的错误在哪里?

时间:2012-10-24 21:17:19

标签: java arrays

我似乎无法弄清楚为什么它打印不正确:

public class test3 {
  public static void main(String[] args) {
    double[] gens = {100, 200.1, 9.3, 10};
    double d0 = 0;
    double d1 = 0;
    double d2 = 0;
    double d3 = 0;
    double d4 = 0;
    double d5 = 0;
    double d6 = 0;
    double d7 = 0;
    double d8 = 0;
    double d9 = 0;
    for (int i = 0; i < gens.length; i++) {
      double percs = gens[i];
      while (percs < -9 || 9 < percs) percs /= 10;
      percs = Math.abs(percs);
      if (percs == 0) {
        d0 += 1;
      }
      else if (percs == 1) {
        d1 += 1;
      }
      else if (percs == 2) {
        d2 += 1;
      }
      else if (percs == 3) {
        d3 += 1;
      }
      else if (percs == 4) {
        d4 += 1;
      }
      else if (percs == 5) {
        d5 += 1;
      }
      else if (percs == 6) {
        d6 += 1;
      }
      else if (percs == 7) {
        d7 += 1;
      }
      else if (percs == 8) {
        d8 += 1;
      }
      else if (percs == 9) {
        d9 += 1;
      }
    }
    double[] pack = {
       d0 /= gens.length,
       d1 /= gens.length,
       d2 /= gens.length,
       d3 /= gens.length,
       d4 /= gens.length,
       d5 /= gens.length,
       d6 /= gens.length,
       d7 /= gens.length,
       d8 /= gens.length,
       d9 /= gens.length
    };
    System.out.println(pack[0]);
    System.out.println(pack[1]);
    System.out.println(pack[2]);
    System.out.println(pack[3]);
    System.out.println(pack[4]);
    System.out.println(pack[5]);
    System.out.println(pack[6]);
    System.out.println(pack[7]);
    System.out.println(pack[8]);
    System.out.println(pack[9]);
  }
}

我知道这很重复,但这就是我现在处理它的方式。

无论如何,基本上,它应该在gens数组中取这四个数字,将它们切换到每个数字的第一个数字(分别为1,2,9和1),然后计算每个数字从0到0的次数-9出现了,所以&#39; 1&#39;应该给0.5(50%),2应该给.25(25%),9应该给.25(25%),其中0-9的每个其他数字应该给0.我得到0.5的数字&#39; 1& #39;,但是对于其他每一个都是0,我还没有找到我的错误。我得到的结果取决于我输入的数字(硬编码),但它们几乎总是错误的。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

更改

double percs = gens[i];

int percs = (int)gens[i];

如果你把它留作双重,你的while循环

while (percs < -9 || 9 < percs) percs /= 10;

不会正确地切除除第一个以外的所有数字,因为它将执行正常除法而不是整数除法。如果在while循环后打印percs,则可以看到此信息。


我还想指出,这可以更轻松地完成很多。例如:

double[] gens = {100, 200.1, 9.3, 10};

int[] count = new int[10];

for (double d : gens)
    count[("" + Math.abs(d)).charAt(0) - '0']++;

for (int n : count)
    System.out.println((double)n / gens.length);

会做同样的事情。

答案 1 :(得分:1)

如果您在每个阶段打印percs,您会发现它们是:

1.0
2.001
0.93
1.0

所以你的==不行。这是因为你正在划分双打而不是整数。您可以改为使用:

int percs = (int) gens[i];

这将为您提供所需的整数值。