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

Java double 类型除法
今天在测试double类型mod运算时意外遇到一个问题:
当两个doublel类型数据做除法运算,或者做mod运算时,结果精度有问题。
比如:
System.out.println(0.6/0.2);
输出结果不是预料中的3.0
而是:2.9999999999999996
做mod元算也是出现同样的问题。
然后我又用其他数据做了相应的测试,发现当除法运算结果为3.0时,结果的精度就会出现异常,
求解答。

------解决方案--------------------
这样直接相除应该是不行的。他们默认应该是float类型的。给你2个方法你都试验一下。
第一种:定义两个变量保存这两个值,然后用变量计算。
Java code

 /**
     * 两个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();
    }

------解决方案--------------------
楼上说错了吧,java中带小数点的默认是double,这应该是java编译器的问题,就像System.out.print(2.0-1.1);输出结果不是0.9,是0.8999999999999999,如果你这样输出System.out.printf("%.1f",2.0-1.1);输出结果就是0.9,再具体的原因我也不知道了,期待牛人来回答!
------解决方案--------------------
Java code
/**
     * @param v1
     * @param v2
     * @param scale 对结果保留几位小数
     * @return
     */
    public static double divide(double v1, double v2,int scale) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale).doubleValue(); 
    }

------解决方案--------------------
转换成BigDecimal
------解决方案--------------------
计算机中存储数字是用2进制表示的,所有在存储double类型的数据并不能精确到0.1,所以在用double做操作的时候会因为精度问题出现一些和实际不一样的结果。
你要求精度很高的话就用BigDecimal来计算