import java.math.BigDecimal;
public class TestDouble {
public static void main(String[] args) {
double d1 = div(20130708154752d,1000000000000d);
double d2 = 16000d;
System.out.println(d1);
System.out.println(sum(d1,d2));
}
public static double sum(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}
public static double div(double v1,double v2){
return div(v1,v2,12);
}
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(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
运行结果是:
20.130708154752
16020.130708154751
如何能避免精度损失的问题?
double?精度?运算
------解决方案--------------------
只能不用double了
------解决方案--------------------
一直用BigDecimal,结果是准确的。
用double转其他类型的时候,已经存在误差了。
------解决方案--------------------
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();divide提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入(BigDecimal.ROUND_HALF_UP)。
你说的损失是存在的。
------解决方案--------------------