为什么周长会这样输出.多了几个零还有后面的数字public class Circle{ final static double pi=3.14; double r; double c = 1.0; public Circle(double r) { this.r=r; } public double perimeter() { return pi*c*2*c; } public double area()

来源:学生作业帮助网 编辑:作业帮 时间:2024/07/08 08:07:09
为什么周长会这样输出.多了几个零还有后面的数字public class Circle{ final static double pi=3.14; double r; double c = 1.0; public Circle(double r) {  this.r=r; } public double perimeter() {  return pi*c*2*c; } public double area()
xXoDWLMvWZTVB_j:/ lg["!TmtJ7 LFAH/gRI̛4wNW0'ݭwSw{{hu}~]_{_ywwDocݹ}n=;zZ=GpX{YS4 9a jh+ahR "8Sb2=G+rIQ.o 9lV,ZzA ZȩY:6 GQ),xX8Dp@NmN"%(wOd.EB8h{LhW=Bo'}4Gr2?ۈ"p*WX/9v?f&I$ttE{R%a_T#5Ù?^30)"3f:RIc16S2:ܕvEo,o(g[8RqD"VY1՚j VU9J)\^6.EIMR:(IKPIl ATJA95FPV3Y9IePFU*)J. JT2ʉM %ibɶ(0%Ln\Jgl>R4,ə Ycj- f꘷x@wkTDᖻָn-I~y\- s?a3oeWBNcm+SĻ μ{ "MZ?gǏܿ~zb8,.O#@)m,ܿ3UӰ:h9gȨ*) 1A#,e4CJw9WX}d{ J\R6lqaq_=튴#[obA4<%` }ȓ$-ݨlLY/WZ 7nba"7 !zd>Uv#Bc\œ.m{vh ! lX C6ZDbE0 [ۍvĶaz8i4Ngg^XyOnɺCv͢6k͙v ZDSb̥(oF2Az٩R%"pQ:G_@o{%w3΃wX]aI>cخ#BGW:B<酙E,>&{r

为什么周长会这样输出.多了几个零还有后面的数字public class Circle{ final static double pi=3.14; double r; double c = 1.0; public Circle(double r) { this.r=r; } public double perimeter() { return pi*c*2*c; } public double area()
为什么周长会这样输出.多了几个零还有后面的数字
public class Circle
{
 final static double pi=3.14;
 double r;
 double c = 1.0;
 public Circle(double r)
 {
  this.r=r;
 }
 public double perimeter()
 {
  return pi*c*2*c;
 }
 public double area()
 {
  return pi*this.r*this.r;
 }
 
 public static void main(String []args)
 {
  Circle c1 = new Circle(10.0);
  Circle c2 = new Circle(20.0);
  System.out.println("半径10周长:"+c1.perimeter());
  System.out.println("半径10面积:"+c1.area());
  System.out.println("半径20面积:"+c2.area());
  System.out.println("半径20周长:"+c2.perimeter()); 
 }
}

我试了很多方法,反正只有两个r相乘才不会有这几个零

为什么周长会这样输出.多了几个零还有后面的数字public class Circle{ final static double pi=3.14; double r; double c = 1.0; public Circle(double r) { this.r=r; } public double perimeter() { return pi*c*2*c; } public double area()
这个可以认为是JAVA的DOUBLE类型的bug.


如果使用java.math.BigDecimal 处理,
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class Circle{
    final static double pi=3.14;
    double r;
    
    public Circle(double r){
        this.r=r;
    }
    
    public double perimeter(){
        BigDecimal a = new BigDecimal(pi).multiply(new BigDecimal(r)).multiply(new BigDecimal(2D));
        return round(a, 2);
    }
    
    public double area(){
        BigDecimal a = new BigDecimal(pi).multiply(new BigDecimal(r)).multiply(new BigDecimal(r));
        return round(a, 2);
    }
    
    static double round(BigDecimal a, int scale){
        String sNumericalValue = a.toPlainString();  
        String[] arrayValues = { "", "" };  

        if (!(sNumericalValue.indexOf(".") < 0)) {  
            arrayValues = sNumericalValue.split("\\.");  
        } else {  
            arrayValues[0] = sNumericalValue;  
        }  

        if (arrayValues[0].contains("-")) {  
            arrayValues[0] = arrayValues[0].replaceAll("-", "");  
        }  

        int intLength = arrayValues[0].length();  

        MathContext context = new MathContext(intLength + scale, RoundingMode.HALF_UP);  
        return a.round(context).doubleValue();  
    }
    
    public static void main(String []args){
        Circle c1 = new Circle(10.0);
        Circle c2 = new Circle(20.0);
        System.out.println("半径10周长:"+c1.perimeter());
        System.out.println("半径10面积:"+c1.area());
        System.out.println("半径20面积:"+c2.area());
        System.out.println("半径20周长:"+c2.perimeter()); 
    }
}