gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:57 29 4
gpt4 key购买 nike

第一次使用 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 位数字。所以我们在这里没有失去任何精度。

由此可见,对于给定的输入,根本无法接收到您期望作为输出的这个长数字。或者您在输入中遗漏了某些内容,或者这是任务中的错误。

关于java - BigDecimal 输出不包含精确的十进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com