在Java中进行计算得出完全错误的答案

3
在下面的代码中,当x = 60且y = 2时,result = 500。这是正确的,但任何60到119之间的x值也会得出500。另外,当x < 60时,我会得到一个除以0的错误。此外,当x >= 120时,result = 0。我对为什么会发生这种情况感到困惑。我还尝试过使用int、float和long的各种组合,但仍然没有成功。
public class main {

    static long result;
    static int x;
    static int y;
    public static void main(String[] args) {
        x = 60;
        y = 2;
        result = 1000 * (1 / (x / 60)) / y;
        System.out.println(result);
    }

}

顺便提一句,我在尝试为Android制作一个节拍器应用程序时遇到了这个问题。我从上下文中取出了这段代码,以便更容易地隔离问题。非常感谢任何帮助和/或建议!

1
提示:int / int -> int。除了将其提升为float/double之外,考虑重写为(1000 * 60) / (x * y) - 这可以减少由于1 / (x / 60)引入的误差。 - user2246674
谢谢,这应该有助于清理代码。 - user1161521
可能是[除法表达式的意外结果]的重复问题。(http://stackoverflow.com/questions/16239727/unexpected-result-of-expressions-with-division) - user207421
而且,为什么整数除法代码会给出错误的答案? - Stephen C
3个回答

6
答案并不是错的,只是和你期望的不同。你正在使用整数除法,会返回一个整数结果,这个结果会被截断成整数结果。
你需要使用浮点数除法来得到一个浮点数结果,而不是整数除法,后者会返回一个整数结果。
// the 1.0 will allow for floating point division
result = (long) (1000 * (1.0 / (x / 60)) / y); 

好的,谢谢!我之前听说过double并且使用过它,但是我脑子一片空白,完全忘记了!太简单了。 - user1161521

1
整数算术表明:
1999 / 100

实际上是19,而不是你可能期望的19.99或20。

如果你使用整数进行除法运算,你将总是得到实际(数学)结果的向下取整。


1
这句话的英译中文为:

该方程可以简化为

result = 1000 * 60 / (x * y);

如果你想要浮点除法的结果:
result = long(1000 * 60.0 / (x * y));

如果您想要圆整的浮点数除法结果:

result = long(1000 * 60.0 / (x * y) + 0.5);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接