2013-03-02 6 views
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); 
    } 
} 
+0

System.out.println (x); вы могли бы попробовать это в своем заявлении? Это поможет вам определить, что x находится на этом пути, и посмотреть, станет ли оно когда-либо. –

+0

Очень избыточно иметь переменную с именем 'three' и присваивать ей' 3'. У вас должно быть значащее имя и сделать его переменной класса. – Maroun

ответ

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

3

Причины рекурсия бесконечна немного неясный: 0.1 не может быть представлен именно в double. Когда вы добавляете 0.1 в 3 десять раз, вы делаете не получите 4 - вы получите номер, близкий к 4, но немного больше его. Это число не делит вашу цель равномерно, поэтому рекурсия продолжается до 4.1, 4.2 и т. Д., Без конца.

Причина та же, почему эта петля никогда не останавливается (try it!):

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

Использование BigDecimal вместо double бы исправить эту проблему, потому что 0.1 будет представлена ​​точно. Конечно, он все равно напечатает неверное сообщение ("is divisible of 3" жестко закодирован, хотя x может быть совершенно другим числом в вызове, когда остаток становится нулевым).

Смежные вопросы