2016-09-03 4 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')를 사용하십시오. 두 경우 모두 'BigDecimal'이 아니라 'double'프리미티브입니다. –

+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

piradius은 이중 기본 유형이므로 다시 참조 할 수 없으며 multiply과 같은 메서드를 사용할 수 없습니다. 이 시도 :

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

또는를 : 그것은 자바와보다 정확한에 내장됩니다으로 예에서

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

, 나는 Math.PIpi 교체. 위의 코드는 Math.PI * radius 값을 받아 BigDecimal으로 변환합니다.