BigDecimal类和以BigDecimal类为基础定义类Arith工具类

一、认识

float和double两种数据类型容易引起精度的丢失,所以java提供BigDecimal类提高精度。该类提供了大量的构造器用于 创建BigDecimal 对象,把所有的基本数值类型变量转换成一个BigDecimal对象。

二、常用的两个构造器:

1、BigDecimal(double value):不推荐使用该构造器,因为当使用new BigDecimal(0.1)来创建一个对象时,它的值不是0.1,而实际上是一个近似0.1的值,表面看着是个0.1。

2、BidDiecimal(String value):推荐使用这个构造器,newBigDecimal("0.1")来创建一个对象时,得到的和预期的一样是个0.1的值。

注意如果非要接收一个double的值得话,可以通过BigDecimal.valueOf(double value)静态方法来创建对象。例如:

BigDecimal f2 = BigDecimal.valueOf(0.01);

三、基本操作

add(BigDecimal value):精确加法

subtract(BigDecimal value):精确减法

multiply(BigDecimal value):精确乘法

divide(BigDecimal value);精确除法

四、java实现

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args){
        BigDecimal f1 = new BigDecimal("0.05");
        BigDecimal f2 = BigDecimal.valueOf(0.01);
        BigDecimal f3 = new BigDecimal(0.05);
        System.out.println(f1);
        System.out.println("使用String作为BigDecimal构造器参数");
        System.out.println(f2);
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01=" + f1.subtract(f2));
        System.out.println("0.05 * 0.01=" + f1.multiply(f2));
        System.out.println("0.05 / 0.01=" + f1.divide(f2));
        System.out.println("使用double作为BigDecimal构造器参数:");
        System.out.println("0.05 + 0.01 =" + f3.add(f2));
        System.out.println("0.05 - 0.01 =" + f3.subtract(f2));
        System.out.println("0.05 * 0.01 =" + f3.multiply(f2));
        System.out.println("0.05 / 0.01 =" + f3.divide(f2));
    }
}

结果:

五、Arith工具类

过程:先将double数值包装成BigDecimal类型,运算出结果后,再转成double类型。

java实现:

import java.math.BigDecimal;

public class Arith {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    //构造器私有,让这个类不能实例化
    private Arith(){}
    //提供精确的加法运算
    public static double add(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }
    //提供精确的减法运算
    public static double sub(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }
    //提供精确的乘法运算
    public static double mul(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }
    //提供精确的除法运算
    public static double div(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2).doubleValue();
    }
}

//ArithMain类

public class ArithMain {
    public static void main(String[] args){
        System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
        System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
        System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
        System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));

    }
}

结果:

 

 

 

 

发布了8 篇原创文章 · 获赞 1 · 访问量 2482
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览