2017-02-09 211 views
1

第一次使用BigDecimal的練習題。 我的主要方法的輸出應該是:BigDecimal輸出不包含精確的十進制值?

半徑圓面積8.5949958is: 232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375

圓的面積與半徑3.440393959403938E7is: 3718483500498323.66662697460176592346057689232315135847190735857072463126614392248114882022491656243801116943359375

然而,這也不是什麼打印編輯。我得到一個圓一個的

232.081671383290555535978683110442943871021270751953125 

價值,併爲3718483500498323.563695圈兩個值。 一位同事告訴我,我需要爲每個值使用BigDecimals,以便輸出精確,但我的印象是我已經在做這個。

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。即使沒有乘以這個數字本身(正方形),我們也可以估計其小數部分的最大位數:它不能超過14數字,因爲10^-7 * 10^-7 = 10^-14。 如果我們把它作爲BigDecimal值和其平方,我們得到:

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

=73.87395280201764其確切的給定輸入的平方值。即這裏沒有精度的損失。

繼續下一步。接下來你將這個數字乘以3.14159。同樣,使用相同的方法,我們可以估計有意義小數部分的最大位數:它不能超過19數字,因爲10^-5 * 10^-14 = 10^-19。讓我們這樣做乘法:

BigDecimal a = Pi.multiply(rad);

=232.0816713832905976476 - 19位。所以我們在這裏沒有失去任何精度。

從下面的例子可以看出,對於給定的輸入,您期望輸出的這些長數字根本無法接收。或者你錯過了輸入內容,或者這是任務中的錯誤。

+0

這是主要的(由我的教授寫的)不正確的可能性。 Circle c = new Circle(); double 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

相關問題