java double类型相加精度问题的解决
我就废话不多说了,大家还是直接看代码吧~
packagecom.hxyl.action;
importjava.text.DecimalFormat;
publicclassTest{
publicstaticvoidmain(String[]args){
//DecimalFormat类主要靠#和0两种占位符号来指定数字长度。0表示如果位数不足则以0填充,#会把最后面的零默认省略。
DecimalFormatdf=newDecimalFormat("0.000");
doubled1=116.32;
doubled2=0.11;
doublecc=d1+d2;
//cc===116.42999999999999(不做处理就是这样)
System.out.println("cc===="+cc);
//dd====116.430
System.out.println("dd===="+df.format(d1+d2));
DecimalFormatdf1=newDecimalFormat("#.###");
doubled11=116.32;
doubled21=0.11;
//dd====116.43
System.out.println("dd1===="+df1.format(d11+d21));
}
}
doublepi=3.1415927;//圆周率
//取一位整数
System.out.println(newDecimalFormat("0").format(pi));//3
//取一位整数和两位小数
System.out.println(newDecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(newDecimalFormat("00.000").format(pi));//03.142
//取所有整数部分
System.out.println(newDecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
System.out.println(newDecimalFormat("#.##%").format(pi));//314.16%
longc=299792458;//光速
//显示为科学计数法,并取五位小数
System.out.println(newDecimalFormat("#.#####E0").format(c));//2.99792E8
//显示为两位整数的科学计数法,并取四位小数
System.out.println(newDecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗号进行分隔。
System.out.println(newDecimalFormat(",###").format(c));//299,792,458
//将格式嵌入文本
System.out.println(newDecimalFormat("光速大小为每秒,###米。").format(c));
补充:javadouble类型运算避免精度丢失
/**
*保留两位小数
*
*@paramvalues
*@return
*/
publicstaticdoubleformat2(doublevalues){
returnnewBigDecimal(Double.toString(values)).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
/**
*
*@paramvalues
*乘数
*@paramvalues2
*被乘数
*@paramdigit
*保留位数
*@return
*/
publicstaticdoublemultiplication(doublevalues,doublevalues2,intdigit){
BigDecimalb1=newBigDecimal(Double.toString(values));
BigDecimalb2=newBigDecimal(Double.toString(values2));
returnb1.multiply(b2).setScale(digit,RoundingMode.HALF_UP).doubleValue();
}
/**
*相加
*
*@paramd1
*@paramd2
*@return
*/
publicstaticdoublesum(doubled1,doubled2){
BigDecimalb1=newBigDecimal(Double.toString(d1));
BigDecimalb2=newBigDecimal(Double.toString(d2));
returnb1.add(b2).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
/**
*相减
*
*@paramd1
*@paramd2
*@return
*/
publicstaticdoublesub(doubled1,doubled2){
BigDecimalb1=newBigDecimal(Double.toString(d1));
BigDecimalb2=newBigDecimal(Double.toString(d2));
returnb1.subtract(b2).setScale(2,RoundingMode.HALF_UP).doubleValue();
}
/**
*相除
*
*@paramd1
*除数
*@paramd2
*被除数
*@return
*/
publicstaticdoubledivide(doubled1,doubled2){
if(d1==0d||d2==0d){
return0d;
}
BigDecimalb1=newBigDecimal(Double.toString(d1));
BigDecimalb2=newBigDecimal(Double.toString(d2));
returnnewDouble(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP).doubleValue());
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。