0

私のコードでは、ある数値が別の数値に均等に分割できるかどうかを示す簡単なプログラムを作成しようとしています (この場合、その数値は 3 です)。今私が言っているのは、x (数値が均等に割り切れない場合に 0.01 を足すと、スタック オーバーフロー エラーが発生するということです。値を 0.2 にすると、9 は 3 で割り切れるということになります。 3 が 6 の後に 3 に

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。10回加算0.1しても、 -は得られませ。に近いが、それより少し大きい数が得られます。その数はターゲットを均等に分割しないため、再帰は、、などに続き、終わりはありません。3444.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

あなたの問題は、2つのdoubleを。と比較することです==。これは、浮動小数点演算の実装方法が原因で、信頼性の低い結果を生成します。メソッドは次のようになります。

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_VALUEBigInteger

于 2013-03-02T07:23:28.377 に答える