浮点方法的奇怪行为。超载?

时间:2014-03-04 01:14:55

标签: java floating-point println

有没有人看到为什么这样做什么都不返回?

public static float  sumDigits(int n) {
    float retVar = 0;
    while (n > 10) {
        float d;
        for (d = 0; d < n; d *= 10);
        d /= 10;
        retVar += n / d;
        n %= d;
    }
    n += n;
    return retVar;
}

我通过

打电话
System.out.println(sumDigits(123) + "");

3 个答案:

答案 0 :(得分:3)

分号错误:

for (d = 0; d < n; d *= 10); // that terminal semicolon will mess you up!

这相当于:

for (d = 0; d < n; d *= 10) {
  // do nothing
} 
  • 摆脱终端分号。
  • 将您的d变量设为for循环的本地变量:for (int d = 0; d < n; d *= 10) {...}
  • 始终将所有循环块括在花括号中
  • 良好的代码格式化并不仅仅是为了使代码循环漂亮 - 它还可以帮助您进行调试。

答案 1 :(得分:2)

正如已经指出的那样,你的分号放置意味着你正在执行一个什么都不做的循环:

    for (d = 0; d < n; d *= 10);
    d /= 10;
    retVar += n / d;
    n %= d;

但只是修复循环结构对你没有帮助:

    for (d = 0; d < n; d *= 10) {
        d /= 10;
        retVar += n / d;
        n %= d;
    }

首先,如果您从d = 0开始,d /= 10d *= 10都将d等于0.这可能不是您想要的。这应该导致无限循环。

其次,假设您从其他d开始:首先,在循环的第一个语句中将其除以10。然后,当你重新开始重复循环时,再次将它乘以10。这只会让你回到你开始的地方。这样也会导致无限循环。

通常,如果在for循环中有一个变量,那么你也可以修改循环体中的相同变量。 (在此示例中为d。)通常这只是一个错误。即使它不是一个错误,你知道你在做什么,我认为它仍然是不好的做法,因为它对读者来说非常混乱;如果你真的想做那样的话,请改用while循环。

答案 2 :(得分:2)

我实际上认为我看到你的for循环应该做什么,这是一个小功能。但正如其他人指出的那样,d从0开始,所以它总是以0结尾。

只需将d更改为1即可停止无限循环:

for (d = 1; d < n; d *= 10);

但答案仍然是错误的,因为看起来你正试图对数字求和。 (例如1 + 2 + 3 = 6,但返回的答案是3.53

由于您正在处理各个数字,因此您不需要小数值,因此使用float是不好的。您希望数字为圆形。因此,您需要将临时变量更改为int。

最后一件事就是跳过最后一位数字。此时我得到3作为答案。将while(n > 10)更改为while(n > 0)后,会返回正确答案。

所以代码就是这样:

public static int sumDigits(int n) {
    int retVar = 0;
    while (n > 0) {
        int d;
        for (d = 1; d < n; d *= 10);

        d /= 10;
        retVar += n / d;
        n %= d;
    }
    return retVar;
}

作为提示,有一种更简单的方法可以解决同样的问题,即从最小的数字开始而不是最大的数字:

while(n > 0) {
    retVar += n % 10;
    n /= 10;
}

最后的注释

如果我对for循环是正确的,那么重要的是,如果你写这样的东西,几乎没有人会认为这是故意的。像这样的语法实际上可能正常工作,但它不明确,更像是一种新奇。

循环可以像这样更换,更清晰,更紧凑:

int d = 0;
while(d < n) {
    d *= 10;
}

或者如果你真的想要:

int d = 0;
while(d < n) d *= 10; // not recommended but clearly has a body