关于在java里面输出精度的问题

定义抽象类shape,在里面定义final static pi=3.14,和计算周长面积方法,circle类继承shape并实现抽象方法,在测试类里面计算圆的周长和面积时,输出结果精度不准确,该怎么办?

源码如下:
shape.java源码
public abstract class shape {
final static double pi = 3.14;
double mianji;
double zhouchang;
public abstract double C();
public abstract double S();
}
circle.java源码
public class circle extends shape{
double r;
circle(double r){
this.r=r;
}
public double C(){
return 2*r*pi;
}
public double S(){
return r*r*pi;
}
}
testShape.java源码
public class testShape {
public static void main(String[] args) {
circle ci = new circle(5);
System.out.println("圆形的周长是" + ci.C() + ";圆形的面积是" + ci.S());
}
}

半径等于5时的结果:圆形的周长是31.400000000000002;圆形的面积是78.5
半径等于6时的结果:圆形的周长是37.68;圆形的面积是113.04

问题:只是当初始化半径为5时出现精度问题,这是什么原因?应该怎样调整?

对于精度要求高的计算请使用java的BigDecimal对象计算.