2017-02-09 66 views
1

BigDecimalを初めて使用する際の練習問題です。 私の主なメソッドの出力は次のようになります。半径の円のBigDecimalの出力に正確な10進値が含まれていませんか?

エリアは8.5949958is: 232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375

半径3.440393959403938E7isの円の面積: 3718483500498323.66662697460176592346057689232315135847190735857072463126614392248114882022491656243801116943359375

しかし、それが何であるかではありません印刷するed。私は丸1用

232.081671383290555535978683110442943871021270751953125 

の値、および円二人3718483500498323.563695の値を取得します。 同僚は出力を正確にするためにすべての値にBigDecimalを使用する必要があると私に通知しましたが、私はすでにこれをやっているという印象を受けています。

import java.math.BigDecimal; 
public class Circle 
{ 
private BigDecimal radius = new BigDecimal("0.0"); 

public Circle() 
{ 
    setRadius(0.0); 
} 
public void setRadius(double r) 
{ 
    this.radius = new BigDecimal(r); 
} 
public BigDecimal findCircleArea(double radius) 
{ 
    this.setRadius(radius); 
    BigDecimal Pi = new BigDecimal("3.14159"); 
    BigDecimal rad = new BigDecimal(Math.pow(radius, 2.0)); 
    BigDecimal a = Pi.multiply(rad); 

    return a; 
} 

} 

必要に応じてマージしますが、見回して回答を見つけることができなかったので、本当にイライラしています。

+0

を。仕事の誤解でない限り、私は個人的にこれらの数字を受け取る方法を知らない。 – Andremoniy

答えて

0

私はあなたの仕事について誤解していると思っています。私は数学的に簡単に証明できます。

最初の例を考えてみましょう。入力時に値は8.5949958になります。乗算を行わなくても、この数(正方形)は小数部の最大桁数を見積もることができます。10^-7 * 10^-7 = 10^-14のため、14桁以上にすることはできません。 我々はBigDecimal値としてそれを取ると、それを二乗する場合は、我々は受け入れる:与えられた入力の二乗の値を正確な

BigDecimal rad = BigDecimal.valueOf(radius).pow(2); 

=73.87395280201764を。私。ここで精度の損失はありません。

次のステップに進んでください。次に、この番号に3.14159を掛けます。繰り返しますが、同じアプローチを使用して、意味のある小数部分の最大桁数を見積もることができます。これは10^-5 * 10^-14 = 10^-19なので19桁以下にすることはできません。のは、この乗算をやってみましょう:

BigDecimal a = Pi.multiply(rad);

=232.0816713832905976476から19桁の数字。だから私たちはここで精度を失うことはありませんでした。

出力から予想されるこの長い数値は、指定された入力に対しては受信できません。あるいは、入力時に何かが間違っている、またはこれがタスクの間違いです。

+0

私の教授が書いた主なメインが間違っている可能性があります。サークルc =新しいサークル(); 倍r1 = 8.5949958; System.out.println( "半径" + r1 + "の円の領域は:"); System.out.println(c.findCircleArea(r1)); System.out.println(); double r2 = 34403939.594039382; System.out.println( "半径" + r2 + "の円の領域は:"); System.out.println(c.findCircleArea(r2)); – bbotezatu

0

doubleの値をできるだけ早くBigDecimalsに変換する必要があります。doubleの値に不正確な値が含まれているため、結果のスケールに寄与する「隠し」余分な数字が含まれています。文字列の使用を避け、doubleの数学をしないでください。

本質的には、これを変更します。これに

BigDecimal Pi = new BigDecimal("3.14159"); 
BigDecimal rad = new BigDecimal(Math.pow(radius, 2.0)); 

を:すてきな謎だ

BigDecimal Pi = new BigDecimal(3.14159); 
BigDecimal rad = new BigDecimal(radius).pow(2); 
+0

'' Pi'の初期化を 'String'から' double'に変更するべきではなく、より多くの数字を指定するべきです。 – EJP

+0

@EJP理想的には、はい、しかし、彼は今削除された答えにこのコメントを残しました: "私にこれを割り当てた教授は、この問題のためだけに3.14159を使うよう指示しました。私はMath.PIで試してみましたが、私はさらに不正確な答えを得ました。彼は、3.14159を使用して正解しか見つけられないと指摘しました。 – VGR

関連する問題