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);
第一次使用 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);