计算机语言对于浮点精度的运算偏差
第一种解决方案:运算后四舍五入
第二种解决方案:调用封装类运算
第一种方案:(治标不治本)
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
DecimalFormatdm=newDecimalFormat(".00");//输出、存储格式控制
System.out.println(round(10.01964,4));
System.out.println(round(10.1234567, 4));
// System.out.println(dm.format(add(4.015,100)));
}
Console输出:
10.02
10.1235
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return四舍五入后的结果
*/
publicstaticdoubleround(doublev,intscale){
if(scale<0){
thrownew IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");/
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();///v与one相除保留scale位有效数字
}
第二种方案:
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
DecimalFormat dm=new DecimalFormat(".00");//输出、存储格式控制
System.out.println(4.015*100);
System.out.println(
dm.format(mul(4.015,100)));
}
/**
* 提供精确的浮点数运算处理。
* @param a 需要输入乘数double类型数字
* @param b需要输入乘数double类型数字
* @return精确地运算结果
*/
//这里只写乘法的运算
publicstaticdouble mul(doublea,doubleb){
BigDecimalb1=newBigDecimal(Double.toString(a));
BigDecimalb2=newBigDecimal(Double.toString(b));
returnb1.multiply(b2).doubleValue();
}
Console输出:
401.49999999999994
401.50