2016-09-03 216 views
-3

サークルの正確な面積を見つけるにはradius*radius*piを掛ける必要がありますが、書き留めたコードは機能しません。それはJava Doubleを間接参照できない

ERROR

----jGRASP exec: javac -g Circle.java 
Circle.java:7: error: double cannot be dereferenced 
     BigDecimal area = radius.multiply(pi); 
          ^
1 error 

CODEプリミティブ型では動作しません間接参照

import java.math.*; 
public class Circle { 
    public BigDecimal findArea(double radius){ 
     double pi = 3.14159; 
     radius = radius * radius; 
     BigDecimal bd = new BigDecimal("1"); 
     BigDecimal area = pi.multiply(radius); 
     return area; 
    } 
} 
+2

本当にそのコードのエラーですか?なぜ、radius.multiply(pi) 'と言うのでしょうか?もう一方は' pi.multiply(radius) 'と言うのでしょうか? –

+2

ただし、 'pi * radius'(または' radius * pi')を使用してください。どちらの場合でも、それらは基本的な 'double'であり、' BigDecimal'ではありません。 –

+0

また、 'Math.PI'を使用する代わりに' double pi'を定義するのはなぜですか?そしてなぜ 'BigDecimal.ONE'を使うのではなく、新しいBigDecimal(" 1 ")'? –

答えて

5

...ダブル間接参照することができないエラーを与えておくあります。 doubleはプリミティブ型です。

したがって

pi.multiply(radius) 

は無効な式です。

BigDecimal area = BigDecimal.valueOf(pi).multiply(BigDecimal.valueOf(radius)); 

またはこの

BigDecimal area = BigDecimal.valueOf(pi*radius); 

代わり:

あなたはこのようなものを使用することができます。

+1

読みやすく、生成されるオブジェクトが少なくなりました: 'BigDecimal area = BigDecimal.valueOf(pi * radius);'。 –

+1

私はまた、 'radius = radius * radius; 'ということを指摘するかもしれません。上の数行は混乱します。単純にその行を削除し、ここに' pi * radius * radius'と書くだけです。 –

+0

'pi * radius'アプローチは、浮動小数点技術のためにはるかに高速に動作しますが、浮動小数点の不正確さを含む異なる結果も与えます。したがって、プログラマが望むものに依存します:近似の結果(2番目の例)またはより遅いがより正確な結果(1番目の例の行)の実行速度。 –

2

piradiusはダブルプリミティブ型です。つまり、逆参照できないため、multiplyなどのメソッドを使用することはできません。

BigDecimal area = BigDecimal.valueOf(pi * radius); 

または::このお試しください、それはJavaへの組み込み、より正確だとして例で

BigDecimal area = BigDecimal.valueOf(Math.PI * radius); 

を、私はMath.PIpiを置換しました。上のコードはMath.PI * radiusの値をとり、それをBigDecimalに変換します。

関連する問題