日期:2014-05-20 浏览次数:20960 次
/** * 两个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,再具体的原因我也不知道了,期待牛人来回答!
------解决方案--------------------
/** * @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来计算