代码检测爆出代码质量:使用浮点数进行精确计算

BigDecimal转换_类型转换

简单说就是不能用doule,不精确,要用BigDecimal BigDecimal是一个对象,它的加减乘除等都跟数字类型不一样,以下就是它的一些常用方法

new一个BigDecimal

BigDecimal num1=new BigDecimal("0.12");

输出结果

BigDecimal转换_类型转换_02

add():相当于加

a.add(b)相当于a+b

BigDecimal num=new BigDecimal("123.22");
		BigDecimal num1=new BigDecimal("0.12");
		System.out.println(num1.add(num));

sub():相当于减

a.subtract(b)相当于a-b

BigDecimal a=new BigDecimal("123.22");
		BigDecimal b=new BigDecimal("0.12");
		System.out.println(a.subtract(b));

multiply():相当于乘

a.multiply(b)相当于乘

BigDecimal a=new BigDecimal("5.22");
		BigDecimal b=new BigDecimal("3.12");
		System.out.println(a.multiply(b));

divide()相当于除

a.divide(b)相当于除,需要注意的是,如果除不尽,就会报错

BigDecimal a=new BigDecimal("16.00");
		BigDecimal b=new BigDecimal("4.00");
		System.out.println(a.divide(b));

java.lang.ArithmeticException

不整除的话会报错,通过指定小数位数和四舍五入规则解决。传入第二个参数,指定小数位个数,并传入第三个参数,指定四舍五入规则。

BigDecimal a=new BigDecimal("17");
		BigDecimal b=new BigDecimal("8.30");
		System.out.println(a.divide(b,2,BigDecimal.ROUND_HALF_UP));

compareTo()比较大小

通过BigDecimal的compareTo方法来进行比较。返回的结果是int类型,-1表示小于,0是等于,1是大于。

if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
 
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

Double和BigDecimal互相转换

double转BigDecimal

  • new BigDecimal(double val):-------------------不推荐 会有一个精度的问题,如下:
  • 使用BigDecimal的静态方法:-------------------推荐
BigDecimal decimalD=BigDecimal.valueOf(a);

BigDecimal转换_类型转换_03

  • 使用Double.toString,-------------------推荐
BigDecimal decimalC=new BigDecimal(Double.toString(a));

BigDecimal转换_spring_04

BigDecimal转double

doubleValue

BigDecimal a=new BigDecimal("23.556");	
		Double b=a.doubleValue();

Float和BigDecimal互相转换

Float转BigDecimal

  • 先用toString,再传入BigDecimal,不损失精度 ----------推荐
float a=545.56f;
		System.out.println(new BigDecimal(Float.toString(a)));

BigDecimal转换_BigDecimal_05

  • 用BigDecimal.valueOf,损失精度 --------------------不推荐
float a=545.56f;
		System.out.println(BigDecimal.valueOf(a));

BigDecimal转换_BigDecimal_06

BigDecimal转Float

使用floatValue

BigDecimal a=new BigDecimal(50);
		System.out.println(a.floatValue());

int和BigDecimal互相转换

int转BigDecimal

int b = 5;
        BigDecimal a = new BigDecimal(b);

BigDecimal转int

BigDecimal b = new BigDecimal(12);
            int c = b.intValue();

Long和BigDecimal互相转换

long转BigDecimal

long b = 5;
        BigDecimal a = new BigDecimal(b);

BigDecimal转Long

longValue会损失精度,四舍五入取整,可以用doubleValue代替

BigDecimal b = new BigDecimal(12);
        Long c = b.longValue();

判断BigDecimal是否为0

BigDecimal值的判断用equals

不能用常规的==0判断,因为它是对象,用equals判断,它首先要判断scale,也就是BigDecimal的小数位数,不但小数前的值得一样,就连位数和小数点后的值必须也一样,如下,10和10.0是false,所以equals也不能用

BigDecimal转换_BigDecimal_07

判断是否为0

使用Bigdecimal.ZERO,true为真,false为假Bigdecimal.ZERO

a.compareTo(BigDecimal.ZERO)==0

两位小数

BigDecimal price = new BigDecimal("5.5564").setScale(2,BigDecimal.ROUND_HALF_UP);//保留两位小数四舍五入5.56;

object转bigdecimal工具类

该工具类来源https://blog.csdn.net/jerrygaoling/article/details/112991645

/**
     * Object转BigDecimal类型
     *
     * @param value 传入Object值
     * @return 转成的BigDecimal类型数据
     */
    public static BigDecimal ToBigDecimal(Object value) {
        BigDecimal bigDec = null;
        if (value != null) {
            if (value instanceof BigDecimal) {
            	bigDec = (BigDecimal) value;
            } else if (value instanceof String) {
            	bigDec = new BigDecimal((String) value);
            } else if (value instanceof BigInteger) {
            	bigDec = new BigDecimal((BigInteger) value);
            } else if (value instanceof Number) {
            	bigDec = new BigDecimal(((Number) value).doubleValue());
            } else {
                throw new ClassCastException("Can Not make [" + value + "] into a BigDecimal.");
            }
        }
        return bigDec;
    }