好吧,我承认标题有点"引人入胜",但是本篇文章真的有用,注意到这个问题以后说不定会减少很多麻烦
起因呢是一个同时在前台页面显示一个double类型的数据时发现末尾多了点东西,举个例子
public class ListTest {
private static double d1=3.14;
private static double d2=2.967;
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(d1-d2);
}
}
正常结果是0.173,可是,神奇的是,结果是这样的(很明显,这是由于浮点数进行运算时丢失精确度造成的)
0.17300000000000004
于是想到了DecimalFormat
DecimalFormat df=new DecimalFormat("#.###");
System.out.println(df.format(d1-d2));
结果ok了,但是,还是存在着问题,由于是使用指定格式输出,然而实际情况并不能确定要按照什么格式输出,不能满足所有场景下的需求,于是又想到了另外一种方法,也就是BigDecimal。
BigDecimal用于来对超过16位有效位的数进行精确的运算,在商业计算中都会用到这个类型,比如金融。因为在商业计算中,由于精确度的丢失会造成很大的损失或者很大的影响,接下来看下实现
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
double sub=b1.subtract(b2).doubleValue();
System.out.println(sub);
//System.out.println(b1.subtract(b2));
注释里的语句实现也可以,这样结果就可以正常计算了