结果误差怎么解决?用圆类创建一个对象,求圆的面积和周长

为什么计算结果是这样?求解一下!
用圆类创建一个对象,求圆的面积和周长

半径为10.0的圆的周长是:62.800000000000004 面积是314.0
半径为5.0的圆的周长是:31.400000000000002 面积是78.5


package Practice;

public class CircleTest {
    public static void main(String[] args) {
        circle c=new circle();
        c.setR(10);
        c.print();
        c.setR(5);
        c.print();
    }

}

class circle{
    private double r;
    public void setR(double r) {
        this.r=r;
    }
    public double getR() {
        return this.r;
    }
    public double getPerimeter() {
        return 3.14*2*r;
    }
    public double getArea() {
        return 3.14*r*r;
    }
    public void print() {
        System.out.println("半径为"+r+"的圆的周长是:"+this.getPerimeter()+" 面积是"+this.getArea());
        
    }
}

你用那个精确类,或者强转


 public float getPerimeter() {
        return (float) (3.14 * 2 * r);
    }
    public float getArea() {
        return (float) (3.14 * r * r);
    }

img

【以下回答由 GPT 生成】

首先遇到的问题就是浮点数精度问题导致的计算误差。浮点数在计算机中是以二进制来存储的,并且不能准确地表示所有的实数。所以,在进行浮点数计算时,会存在一定的误差。

为了解决这个问题,我们可以使用Java中提供的BigDecimal类来进行精确计算。BigDecimal类可以表示任意精度的十进制数,并且提供了各种计算方法。

下面是对你给出的代码进行修改后的示例代码:

package Practice;

import java.math.BigDecimal;

public class CircleTest {
    public static void main(String[] args) {
        Circle c = new Circle();
        c.setR(new BigDecimal("10"));
        c.print();
        c.setR(new BigDecimal("5"));
        c.print();
    }
}

class Circle {
    private BigDecimal r;
    public void setR(BigDecimal r) {
        this.r = r;
    }
    public BigDecimal getR() {
        return this.r;
    }
    public BigDecimal getPerimeter() {
        BigDecimal pi = new BigDecimal("3.14");
        BigDecimal two = new BigDecimal("2");
        return pi.multiply(two).multiply(r);
    }
    public BigDecimal getArea() {
        BigDecimal pi = new BigDecimal("3.14");
        return pi.multiply(r).multiply(r);
    }
    public void print() {
        System.out.println("半径为" + r + "的圆的周长是:" + this.getPerimeter() + " 面积是:" + this.getArea());
    }
}

在修改后的代码中,我们使用BigDecimal类代替了double类型,并且使用字符串来初始化BigDecimal对象,以避免浮点数精度问题。同时,我们使用BigDecimal类提供的乘法方法multiply进行计算。

通过这样的修改,我们能够得到更准确的结果。现在,半径为10.0和5.0的圆分别计算得到的周长和面积结果如下:

半径为10.0的圆的周长是:62.80 面积是:314.00 半径为5.0的圆的周长是:31.40 面积是:78.50

这样就解决了圆的面积和周长计算结果误差的问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^