0

在我的代码中,我只是想制作一个简单的程序,告诉你一个数字是否可以均匀地分成另一个数字(在这种情况下,这个数字是 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);
   }
}
4

2 回答 2

3

递归是无限的原因有点模糊:0.1不能在double. 当你0.1加到310 次时,你不会得到4- 你会得到一个接近4但比它大一点的数字。该数字不会均匀地划分您的目标,因此递归继续到4.14.2,等等,没有结束。

原因与此循环永不停止的原因相同(试试看!):

for (double x = 3 ; x != 4 ; x += 0.1) {
    System.out.println(x);
}

使用BigDecimal代替double将解决问题,因为0.1将被准确地表示。当然,它仍然会打印错误消息("is divisible of 3"即使x在余数变为零时调用中的数字可能是完全不同的数字,也是硬编码的)。

于 2013-03-02T07:23:37.877 回答
1

您的问题是您将两个双打与==. 由于浮点运算的实现方式,这将产生不可靠的结果。您的方法应如下所示:

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

于 2013-03-02T07:23:28.377 回答