割り当てがあり、ユーザーからの入力を取得して、x (ユーザーの入力) の小数点以下の桁数への回答を絞り込む必要があります。x の小数点以下の桁数に変化がなくなるまで、回答を絞り込みます。この回答を達成する方法を教えてください。
3 に答える
何を達成しようとしているのかは明確ではありませんが、数値を受け入れて、ユーザーが指定したとおりに切り上げたいと思います。
JavaのBigDecimalhttp ://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.htmlクラスには、この目的に必要なすべての関数が含まれています。遅かれ早かれ丸め誤差が発生するため、プライマリデータ型(float、double)は使用しないでください。
この辺りにはたくさんの問題が浮かんでいるので、注意する必要があります。
1つ目は、浮動小数点数を使用して回答を表す場合、考えられるすべての実数を表すことはできないため、ほぼ確実に丸め誤差が発生することです。これに関する優れた情報については、http://floating-point-gui.de/をチェックしてください。
次に、float
ordouble
値を出力すると、Javaはそれを使って魔法をかけ、見栄えを良くします。詳細についてはFloat.toString(float)
、およびDouble.toString(double)
を参照してください。
だから実際には、あなたが入ると
double answer = 3.14159265;
として保存されます
3.141592650000000208621031561051495373249053955078125
あなたが使用して見ることができる
System.out.println(new BigDecimal(answer));
したがって、答えをdouble
(または)として取得すると仮定すると、のメソッドfloat
を使用する必要があります。また、ユーザーが選択できる小数点以下の桁数を、文字列として出力するときに表示される数値に制限する場合は、のコンストラクターに渡します。BigDecimal
setScale
double
String.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
ます。浮動小数点数を扱うときは多くの境界条件があることを覚えておいてください、そしてあなたは良いはずです!
@Thiharaの答えは真実ですが、もう少し単純なアプローチが必要かもしれません。の精度が必要でない限り、次のBigDecimal
ようにできます。
int x = 4;
double value = 3.141593;
long answer = (long) (value * Math.pow(10, x));
ポイントは、値に 10^x を掛けてからlong
(またはint
) に変換することです。もちろん、これは small に対してのみ機能しx
ます。