java 两个Double类型的数值之间的加减操作
问题:
刚开始时候,是直接用double去进行加减。但是后来发现,原本3570竟然显示成:3569.9999999999995
原因:
double类型之间的运算不能直接使用Double来直接进行运算:因为计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。
在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
处理方法:
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。例如:
BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2));
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。 3、把BigDecimal对象转换成float,double,int等类型。 进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。例如:
d1.add(bd2).doubleValue()
处理代码:
DoubleUtils
import java.math.BigDecimal;
public class DoubleUtil {
/**
* double 相加
* @param d1
* @param d2
* @return
*/
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();
}
/**
* double 相减
* @param d1
* @param d2
* @return
*/
public static double sub(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.subtract(bd2).doubleValue();
}
/**
* double 乘法
* @param d1
* @param d2
* @return
*/
public static double mul(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.multiply(bd2).doubleValue();
}
/**
* double 除法
* @param d1
* @param d2
* @param scale 四舍五入 小数点位数
* @return
*/
public static double div(double d1,double d2,int scale){
// 当然在此之前,你要判断分母是否为0,
// 为0你可以根据实际需求做相应的处理
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.divide(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* double 转 string 去掉后面锝0
* @param i
* @return
*/
public static String getString(double i){
String s = String.valueOf(i);
if(s.indexOf(".") > 0){
//正则表达
s = s.replaceAll("0+?$", "");//去掉后面无用的零
s = s.replaceAll("[.]$", "");//如小数点后面全是零则去掉小数点
}
return s;
}
public static void main(String[] args) {
String i=numberToBits("10000000.01");
System.out.println(i);
}
/**
* 数字转换为千位符
* @param number
* @return
*/
public static String numberToBits(String number){
String begin="";
String end="";
String[] num=number.split("\.");
if(num.length>1){
begin=num[0];
end=num[1];
}else{
begin=number;
}
return begin.replaceAll("(?<=\d)(?=(?:\d{3})+$)", ",")+"."+end;
}
}
