日期:2014-05-20  浏览次数:20679 次

程序算出来的数和计算器算出来的不一样
public class Constants{
public static void main(String[] args){
final double a = 4.6;
double b = 4.5;
double c = 5.5;
System.out.println("Paper size is centimeters:"+a*b+"by"+a*c);
}
}
程序算出来的数和计算器算出来的不一样,我把a*b,a*c改成b*a,c*a算出来的数又变了
请问下是怎么回事啊?

------解决方案--------------------
java中的浮点数类型float和double不能进行运算,遇到有些数据得到的数据不准确。如:3.121-1=3.1209999999998。解决办法如下:

Java code

blic class Arith {  
  private static final int DEF_DIV_SCALE = 10;  
    
  /** 
   * 两个Double数相加 
   * @param v1 
   * @param v2 
   * @return Double 
   */  
  public static Double add(Double v1,Double v2){  
      BigDecimal b1 = new BigDecimal(v1.toString());  
      BigDecimal b2 = new BigDecimal(v2.toString());  
      return b1.add(b2).doubleValue();  
  }  
    
  /** 
   * 两个Double数相减 
   * @param v1 
   * @param v2 
   * @return Double 
   */  
  public static Double sub(Double v1,Double v2){  
      BigDecimal b1 = new BigDecimal(v1.toString());  
      BigDecimal b2 = new BigDecimal(v2.toString());  
      return b1.subtract(b2).doubleValue();  
  }  
    
  /** 
   * 两个Double数相乘 
   * @param v1 
   * @param v2 
   * @return Double 
   */  
  public static Double mul(Double v1,Double v2){  
      BigDecimal b1 = new BigDecimal(v1.toString());  
      BigDecimal b2 = new BigDecimal(v2.toString());  
      return b1.multiply(b2).doubleValue();  
  }  
    
  /** 
   * 两个Double数相除 
   * @param v1 
   * @param v2 
   * @return Double 
   */  
  public static Double div(Double v1,Double v2){  
      BigDecimal b1 = new BigDecimal(v1.toString());  
      BigDecimal b2 = new BigDecimal(v2.toString());  
      return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();  
  }  
    
  /** 
   * 两个Double数相除,并保留scale位小数 
   * @param v1 
   * @param v2 
   * @param scale 
   * @return Double 
   */  
  public static Double div(Double v1,Double v2,int scale){  
      if(scale<0){  
          throw new IllegalArgumentException(  
          "The scale must be a positive integer or zero");  
      }  
      BigDecimal b1 = new BigDecimal(v1.toString());  
      BigDecimal b2 = new BigDecimal(v2.toString());  
      return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  
  }