2017-02-09 274 views
1

第一次使用BigDecimal的练习题。 我的主要方法的输出应该是:BigDecimal输出不包含精确的十进制值?

半径圆面积8.5949958is: 232.081671383290563028029402608911005665488497019210725540793500930304148269265220664195247142820189371870652494944664567810832522809505462646484375

圆的面积与半径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; 
} 

} 

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

+0

这是一个不错的谜语。我个人不知道如何接收这些数字,如果它不是误解任务。 – Andremoniy

回答

0

我认为你误解了你的任务,或者你错过了输入数据中的某些东西。我可以在数学基础上证明它很容易。

考虑你的第一个例子:在输入时,你的值等于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位。所以我们在这里没有失去任何精度。

从下面的例子可以看出,对于给定的输入,您期望输出的这些长数字根本无法接收。或者你错过了输入内容,或者这是任务中的错误。

+0

这是主要的(由我的教授写的)不正确的可能性。 Circle c = new Circle(); double r1 = 8.5949958; System.out.println(“半径为”+ r1 +“的圆的面积为:”); System.out.println(c.findCircleArea(r1)); System.out.println(); double r2 = 34403939.594039382; System.out.println(“半径为”+ r2 +“的圆的面积为:”); System.out.println(c.findCircleArea(r2)); – bbotezatu

0

要获得所有这些精度数字,您需要尽快将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); 
+0

他不应该将'Pi'的初始化从'String'改为'double',他应该指定更多的数字。 – EJP

+0

@EJP理想情况下,是的,但他在一个现在被删除的答案上留下了这样的评论:“分配给我的教授已经指示这个问题只使用3.14159;我用Math.PI试过了,我得到了一个更不准确的答案。他指出,我只会使用3.14159找到正确答案。“ – VGR

相关问题