日期:2014-05-20 浏览次数:21172 次
/**
* 两个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来计算