代码检测爆出代码质量:使用浮点数进行精确计算
简单说就是不能用doule,不精确,要用BigDecimal BigDecimal是一个对象,它的加减乘除等都跟数字类型不一样,以下就是它的一些常用方法
new一个BigDecimal
BigDecimal num1=new BigDecimal("0.12");
输出结果
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);
- 使用
Double.toString
,-------------------推荐
BigDecimal decimalC=new BigDecimal(Double.toString(a));
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.valueOf,损失精度 --------------------不推荐
float a=545.56f;
System.out.println(BigDecimal.valueOf(a));
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也不能用
判断是否为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;
}