在我的代码中,我只是试图制作一个简单的程序,告诉你一个数字是否可以平均地划分成另一个数字(在这种情况下,这个数字是3(。现在我想说的是,如果x(这个数字没有被整除,加上0.01,这就产生了堆栈溢出错误。如果我把值设为0.2,它就表明9可以被三整除,而实际上,三之后被整除的下一个数字是6
public class divisible {
public static void divide(double x) {
double three = 3;
double value = x%three;
if (value==0) {
System.out.println(x + " is a divisible of 3 ");
return;
}else{
//System.out.println("x does not divide evenly into 3");
divide(x+(.01));
}
}
public static void main(String args[]) {
divide(4);
}
}
递归是无限的原因有点模糊:0.1
不能在double
中精确表示。当你把0.1
加到3
上十次时,你得到的不是4
——你得到的是一个接近4
但略大于它的数字。这个数字不能平分你的目标,所以递归继续到4.1
、4.2
等等,没有结束。
原因与此循环从未停止的原因相同(试试吧!(:
for (double x = 3 ; x != 4 ; x += 0.1) {
System.out.println(x);
}
使用BigDecimal
来代替double
将解决问题,因为0.1
将被精确地表示。当然,它仍然会打印错误的消息("is divisible of 3"
是硬编码的,即使当余数为零时,x
在调用中可能是完全不同的数字(。
您的问题是将两个双打与==
进行比较。由于浮点运算的实现方式,这将产生不可靠的结果。你的方法应该是这样的:
public static void divide(int x) {
int three = 3;
int value = x%three;
if (value==0) {
System.out.println(x + " is a divisible of 3 ");
return;
}else{
System.out.println("x does not divide evenly into 3");
// divide(x+(.01));
}
}
如果您希望使用双参数访问该方法,可以强制转换:
public static void divide(double x) {
x = (int) Math.round(x);
如果您想处理大于Integer.MAX_VALUE
的数字,您可以使用BigInteger