BigDecimal 输出不包含精确的十进制值?

BigDecimal output does not contain precise decimal values?

第一次使用 BigDecimal 练习题。 我的主要方法输出应该是:

Area of circle with radius 8.5949958is: 232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375

Area of circle with radius 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;
}

}

如果需要,请合并,但我环顾四周并没有找到答案,这让我很沮丧。

我认为您可能误解了您的任务,或者您遗漏了输入数据中的某些内容。我可以很容易地在数学基础上证明它。

考虑您的第一个示例:在输入中,您的值等于 8.5949958。即使不对该数字本身(平方)进行乘法运算,我们也可以估计其小数部分的最大位数:它不能超过 14 位,因为 10^-7 * 10^-7 = 10^-14。 如果我们将其作为 BigDecimal 值并对其求平方,我们将收到:

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

=73.87395280201764 这是给定输入的平方的精确值。 IE。这里没有精度损失。

进入下一步。接下来,将此数字乘以 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);