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()); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。