如果我们要用Java来计算两个浮点数的和,因为浮点数在加和的时候可能会出现精度丢失的情况,比如下面这个代码:
public class text {
public static void main(String[] args) {
System.out.println(0.01+0.09);
}
}
这个代码的本意是直接输出两个浮点数的和,照理说应该输出的结果是0.1,然而最终的编译结果是:0.09999999999999999;
你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。
这就是浮点数加和的时候容易出现的精度丢失的情况,那么我们想要解决这个问题呢?这时候就用到了java.math包中的BigDecimal类,调用这个类中的方法可以结果精度丢失的问题。
同样的要加和0.01和0.09就可以使用以下的代码来代替:
public class deecimal {
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(0.01);
BigDecimal bd2 = BigDecimal.valueOf(0.09);
BigDecimal bd = bd1.add(bd2);
double d = bd.doubleValue();
System.out.println(d);
}
这个代码的最终结果就是0.1了。
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算
3、把BigDecimal对象转换成float,double,int等类型。
一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。
如上述的代码:
BigDecimal bd1 = BigDecimal.valueOf(0.01);
BigDecimal bd2 = BigDecimal.valueOf(0.09);
进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等将Bigdecimal对象转换为float或double的变量,如上述代码中的:
double d = bd.doubleValue();