1

割り当てがあり、ユーザーからの入力を取得して、x (ユーザーの入力) の小数点以下の桁数への回答を絞り込む必要があります。x の小数点以下の桁数に変化がなくなるまで、回答を絞り込みます。この回答を達成する方法を教えてください。

4

3 に答える 3

0

何を達成しようとしているのかは明確ではありませんが、数値を受け入れて、ユーザーが指定したとおりに切り上げたいと思います。

JavaのBigDecimalhttp ://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.htmlクラスには、この目的に必要なすべての関数が含まれています。遅かれ早かれ丸め誤差が発生するため、プライマリデータ型(float、double)は使用しないでください。

于 2012-06-17T07:44:22.863 に答える
0

この辺りにはたくさんの問題が浮かんでいるので、注意する必要があります。

1つ目は、浮動小数点数を使用して回答を表す場合、考えられるすべての実数を表すことはできないため、ほぼ確実に丸め誤差が発生することです。これに関する優れた情報については、http://floating-point-gui.de/をチェックしてください。

次に、floatordouble値を出力すると、Javaはそれを使って魔法をかけ、見栄えを良くします。詳細についてはFloat.toString(float)、およびDouble.toString(double)を参照してください。

だから実際には、あなたが入ると

double answer = 3.14159265;

として保存されます

3.141592650000000208621031561051495373249053955078125

あなたが使用して見ることができる

System.out.println(new BigDecimal(answer));

したがって、答えをdouble(または)として取得すると仮定すると、のメソッドfloatを使用する必要があります。また、ユーザーが選択できる小数点以下の桁数を、文字列として出力するときに表示される数値に制限する場合は、のコンストラクターに渡します。BigDecimalsetScaledoubleString.valueOf(answer)BigDecimal

これを行う方法を示す小さなプログラムがあります

public static void main(String[] args) {
    double answer = 3.14159265;

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String input = null;
    do {
        System.out.println("Answer: " + answer);
        System.out.println("How many decimal places do you want? ");
        try {
            input = in.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (input != null) {
            try {
                int decimalPlaces = Integer.parseInt(input);
                if (decimalPlaces < 0) {
                    System.out.println("Enter a positive value.");
                } else {
                    BigDecimal scaled = new BigDecimal(
                            String.valueOf(answer));
                    if (decimalPlaces > scaled.scale()) {
                        System.out
                                .println("Answer does not have that many decimal places.");
                    } else {
                        scaled = scaled.setScale(decimalPlaces,
                                RoundingMode.HALF_EVEN);
                        System.out.println("Rounded answer: " + scaled);
                    }
                }
            } catch (Exception e) {
                System.out.println("Not a valid number.");
            }
        }
    } while (input != null);
}

ほとんどのコードはエラー/入力チェックです。実際の作業はによって行われsetScaleます。浮動小数点数を扱うときは多くの境界条件があることを覚えておいてください、そしてあなたは良いはずです!

于 2012-06-17T21:08:54.913 に答える
0

@Thiharaの答えは真実ですが、もう少し単純なアプローチが必要かもしれません。の精度が必要でない限り、次のBigDecimalようにできます。

    int x = 4;
    double value = 3.141593;

    long answer = (long) (value * Math.pow(10, x));

ポイントは、値に 10^x を掛けてからlong(またはint) に変換することです。もちろん、これは small に対してのみ機能しxます。

于 2012-06-17T07:49:28.403 に答える