2014-05-12 43 views
4

我是BigDecimal的新手。
我使用Java代碼嘗試了一些數學計算。當我使用谷歌計算器進行相同的計算時,它給我的結果略有不同。哪一個是最準確的?如果Google計算器更準確,那麼如何提高java代碼來匹配呢?這個BigDecimal計算有什麼問題嗎?

在谷歌計算器:

134.23576185216913 - (134.23576185216913×√(1 - (2億^ 2÷299800000^2)))= 34.2357618522

在爪哇:

 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))))))); 

bigSqrt的方法是從here

結果是:

運行: 34.683856455950090090043113321827989040137639817587194953722595479211000578082422197809603912048352550091209304856567024386365147605287692511973841869226169664820176852861655846233912503305984796190828666994508412096618025960010635831985100961879858807909056676663493607611105279976694118991120829708264297254294821755138400476425886154174804687500
BUILD SUCCESSFUL(總時間:0秒)

+0

這可能有助於降低下來到最小的部分仍然顯示差異。例如,我想象這種損失不在減法中,你可能會刪除那部分並仍然看到差異。最簡單的情況總是最容易調試。 –

+1

儘管您使用BidDecimal,但您可以使用'double'文字構造它:'134.23576185216913'。精度的改變從那裏開始。你從哪裏得到'134.23576185216913'?這可以預先表示爲一個分數嗎?這可能會有更好的結果。 – Nivas

+0

「SquareRoot」類從哪裏來? – Nivas

回答

0

這是一個有點我不清楚什麼是數學和數據結構方面發生的事情。據我的理解,BigDecimal只能表示某些有理數,決不是任意平方根。 SquareRoot中的鏈接方法將返回實際平方根的一些近似值,這似乎也是對代碼的表面檢查。

7

這是你的問題:

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

你是四捨五入劃分爲2位小數。改爲使用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