Java中的程序永远不会结束

Java中的程序永远不会结束,java,infinite-loop,Java,Infinite Loop,我高中时只上过Java初学者课程,所以我只是在学习Java。这是我的节目 public static void CubeRoot(double number, double guess) { double r = number; double a = guess; double b = 0; double goal = Math.pow(number,.333333333333); while (Math.round(b * 10000) / 10000

我高中时只上过Java初学者课程,所以我只是在学习Java。这是我的节目

public static void CubeRoot(double number, double guess)
{
    double r = number;
    double a = guess;
    double b = 0;
    double goal = Math.pow(number,.333333333333);
    while (Math.round(b * 10000) / 10000 != Math.round(goal * 10000) / 10000)
    {
        b = ((1/3)*((r/(a*a))+(2*a)));
        b = a;
    }
    System.out.println(b);
}

我试图用牛顿-拉斐逊方法得到10.6的立方根的近似值。问题是程序运行但从不打印任何内容。

它永远循环,因为您为
b
指定了一个值,然后用
a
覆盖它。这意味着每当循环开始时,
b
将具有与
a
的初始值相同的值

从牛顿-拉斐逊算法来看,我认为你真正想要的是

b = ((1.0/3.0)*((r/(a*a))+(2*a)));
a = b;

a
设置为您刚才计算的
b
的新值,以便在下一次迭代中使用。您还应该使用
1.0/3.0
而不是
1/3
。整数除法会截断结果,因此
1/3
等于
0
,而不是像您希望的那样
0.33

您需要修复内部循环,因为在第二次迭代之后,如果不满足中断条件,您将永远循环

b=((1/3)*((r/(a*a))+(2*a));
b=a;

将始终按照相同的答案进行计算,因为
a
永远不会改变。此外,如上所述,分配
b=a将撤消第一次计算。但是无论哪种方式,您的内部逻辑都会阻止循环计算为true。

在循环中添加一个打印,以便您可以看到
b
发生了什么。此外,while的RHS是一个常数,因此最好只计算一次并重用它。浮点数字很棘手,在这种情况下,严格相等不是您应该检查的。相反,当近似值在目标的某个范围内时,您应该终止循环。@Pointy您的意思是这样的吗?(b!=goal+.0001 | | b!=goal-.0001){b=((1.0/3.0)*((r/(a*a))+(2*a));a=b;}只需从目标中减去近似值并取绝对值,然后将其与“足够接近”的值进行比较。我还建议将(1/3)替换为(1.0/3.0)以避免整数除法。@JimLewis很好的建议。固定的。