当前位置: 代码迷 >> J2SE >> 程序算出来的数跟计算器算出来的不一样
  详细解决方案

程序算出来的数跟计算器算出来的不一样

热度:6526   发布时间:2013-02-25 00:00:00.0
程序算出来的数和计算器算出来的不一样
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();    }
  相关解决方案