为什么计算结果是这样?求解一下!
用圆类创建一个对象,求圆的面积和周长
半径为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);
}
【以下回答由 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
这样就解决了圆的面积和周长计算结果误差的问题。
【相关推荐】