[英]BigDecimal output does not contain precise decimal values?
第一次使用BigDecimal練習問題。 我的主要方法輸出應該是:
半徑為8.5949958的圓的面積:232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375
半徑為3.440393959403938E7的圓的面積:3718483500498323.66662697460176592346057689232315135847190735857072463126614392248114882022491656243801116943359375
然而,這不是印刷品。 我得到的價值
232.081671383290555535978683110442943871021270751953125
對於圓圈1,對於圓圈2,值為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;
}
}
合並,如果你需要,但我環顧四周,無法找到答案,這真的讓我感到沮喪。
我認為你對你的任務有誤解,或者你錯過了輸入數據中的某些內容。 我可以在數學基礎上證明它很容易。
首先考慮你的例子:輸入時你的值等於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位數。 所以我們在這里沒有失去任何精確度。
從下面的內容可以看出,對於給定的輸入,您在輸出上預期的長數字無法接收。 或者你錯過了輸入內容,或者這是任務中的錯誤。
要獲得所有這些精度數字,您需要盡快將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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.