2014-05-12 3 views
4

저는 BigDecimal을 처음 사용합니다.
Java 코드를 사용하여 수학 계산을 시도했습니다. Google 계산기를 사용하여 동일한 계산을 시도 할 때 약간 다른 결과가 나타납니다. 어느 것이 가장 정확합니까? Google 계산기가 더 정확한 경우 Java 코드를 개선하여 Java 코드와 일치시키는 방법은 무엇입니까?이 BigDecimal 계산에 문제가 있습니까?

 BigDecimal t1 = new BigDecimal(134.23576185216913); 
     BigDecimal one = new BigDecimal(1); 
     BigDecimal speed = new BigDecimal(200000000).pow(2); 
     BigDecimal lightsSpeed = new BigDecimal(299800000).pow(2); 

     MathContext mc = new MathContext(2, RoundingMode.HALF_UP); 
     System.out.println(t1.subtract((t1.multiply(SquareRoot.bigSqrt(one.subtract(speed.divide(lightsSpeed,mc))))))); 

: - (134.23576185216913 ×의 √ (1 - (200,000,000^2 299800000^2)) ÷) = 자바에 34.2357618522

134.23576185216913 : 구글 계산기에

bigSqrt의 메소드는 다음과 같습니다. here

결과는

0123입니다.

실행 : 34.683856455950090090043113321827989040137639817587194953722595479211000578082422197809603912048352550091209304856567024386365147605287692511973841869226169664820176852861655846233912503305984796190828666994508412096618025960010635831985100961879858807909056676663493607611105279976694118991120829708264297254294821755138400476425886154174804687500
BUILD SUCCESSFUL (총 시간 : 0 초)으로

+0

이 가장 작은 부분이 아래로 감소하는 것이 도움이 될 수있다 여전히 어느 차이점을 보여줍니다. 예를 들어, 손실이 뺄셈에 없다고 상상해보십시오. 아마 그 조각을 제거하고 여전히 차이를 볼 수 있습니다. 가장 간단한 경우는 항상 디버그하는 것이 가장 쉽습니다. –

+1

이벤트'BidDecimal'을 사용하더라도'double' 리터럴로 구성됩니다 :'134.23576185216913'. 정확한 변경이 바로 시작됩니다. 어디에서'134.23576185216913'을 얻을 수 있습니까? 이것이 분수로 표시 될 수 있습니까? 그것은 더 나은 결과를 낼 수 있습니다. – Nivas

+0

그리고'SquareRoot' 클래스는 어디에서 왔습니까? – Nivas

답변

0

수학적 및 데이터 구조의 측면에서 무슨 일이 일어나고 있는지 나에게 조금 불분명하다. 내 이해를 위해, BigDecimal은 임의의 제곱근을 의미하는 것이 아니라 특정의 유리수만을 나타낼 수 있습니다. SquareRoot의 연결된 메서드는 실제 제곱근에 대한 근사값을 반환합니다. 이는 코드의 표면 검사에서 비롯된 것으로 보입니다. 당신은 소수점 이하 2 자리까지 분할 반올림하는

MathContext mc = new MathContext(2, RoundingMode.HALF_UP); 

:

7

이 당신의 문제입니다. 대신에 MathContext mc = new MathContext(15, RoundingMode.HALF_UP);을 사용하면 (예를 들어) 예상 결과에 더 가까운 것을 얻을 수 있습니다.

당신이 차분 볼 수 인쇄

System.out.println(speed.divide(lightsSpeed,new MathContext(2, RoundingMode.HALF_UP))); 
System.out.println(speed.divide(lightsSpeed,new MathContext(15, RoundingMode.HALF_UP))); 

을 :

0.45
0.445037630156818