簡體   English   中英

BigDecimal輸出不包含精確的十進制值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM