当前位置: 代码迷 >> Java相关 >> Java double 门类除法
  详细解决方案

Java double 门类除法

热度:3968   发布时间:2013-02-25 21:44:57.0
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来计算
  相关解决方案