Java double类型相加问题

来源:互联网 发布:全国教育经费统计软件 编辑:程序博客网 时间:2024/05/16 04:06
double1+double2  其数据可能没有误差但是,多个double直接相加的时候,存在精度误差,

这个时候就要采用bigDecimal函数进行运算
首先建立String类型的数据,BigDecimal(Double.toString(double))
如果写BigDecimal(double)或者BigDecimal(Double.valueOf(double)))
那样依旧有精度误差,
只有在String类型下的double运算,才会避免精度误差。

new BigDecimal(Double.toString(double)).add(new BigDecimal(Double.toString(double));
    /**     * @param b1     *            BigDecimal     * @param v2     *            double     * @return BigDecimal     * */    public BigDecimal add(BigDecimal b1, double v2) {        // BigDecimal b1=new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.add(b2);    }
    /**     * @param b1     *           double     * @param v2     *            double     * @return BigDecimal     * */    public BigDecimal add(double v1, double v2) {         BigDecimal b1=new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.add(b2);    }
    /**     * @param b1     *           double     * @param v2     *            double     * @return double     * */    public double add(double v1, double v2) {         BigDecimal b1=new BigDecimal(Double.toString(v1));        BigDecimal b2 = new BigDecimal(Double.toString(v2));        return b1.add(b2).doubleValue();    }

二、double 三种加法比较
+,strictfp,BigDecimel

public class MathDemo {    /**     * @param args     */    public static void main(String[] args) {        System.err.println("普通 "+ addNormal(12353.21,21334.24,154435.03));        System.err.println("strictfp "+addDouble(12353.21,21334.24,154435.03));        System.err.println("BigDEcimel: "+add(12353.21,21334.24,154435.03));    }    public static double addNormal(double... v1) {        double res = 0;        for (int i = 0; i < v1.length; i++) {            res += v1[i];        }        return res;    }    public static strictfp double addDouble(double... v) {        double res = 0;        for (int i = 0; i < v.length; i++) {            res += v[i];        }        return res;    }    /**     * @param b1     *            double     * @param v2     *            double     * @return double     */    public static double add(double... v) {        BigDecimal b  = new BigDecimal(Double.toString(v[0]));        for (int i = 1; i < v.length; i++) {            BigDecimal b2 = new BigDecimal(Double.toString(v[i]));            b=b.add(b2);        }        return b.doubleValue();    }}
输入    12353.21,21334.24,154435.03三个类型的数据时候结果:    普通 188122.47999999998    strictfp 188122.47999999998    BigDEcimel: 188122.48输入    3.21, 4.24,5.03结果    普通 12.48    strictfp 12.48    BigDEcimel: 12.48输入:    12353.21,21334.24结果:    普通 33687.45    strictfp 33687.45    BigDEcimel: 33687.45
4 0