BigDecimal使用

217 阅读2分钟

BigDecimal关键字

BigDecimal是Java在java.math包下面提供的一个关键字,可以用于用于浮点数的计算,因为在一般情况下,使用单精度浮点float或者双精度浮点double,可能会造成精度缺失

Float造成精度缺失

public class FloatDemo {  
  
  
public static void main(String[] args) {  
float z = 0.3f * 3;  
System.out.println(z);  
}  
}

其输出结果为:

image.png

double造成精度缺失

public class DoubleDemo {  
  
public static void main(String[] args) {  
double number1 = 10;  
double number2 = 20.2;  
double number3 = 300.03;  
double result = number1 + number2 + number3;  
System.out.println(result);  
}  
}

结果为:

image.png

BigDecimal使用

BigDecimal提供的方法

BigDecimal(int) 创建一个具有参数所指定整数值的对象

BigDecimal(double) 创建一个具有参数所指定双精度值的对象

BigDecimal(long) 创建一个具有参数所指定长整数值的对象

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象

加减乘除的方法

add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象

subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象

multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象

divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象

BigDecimal保留小数点后几位数字

public class BigDecimalDemo {  
  
public static void main(String[] args) {  
BigDecimal bd = new BigDecimal("1.23456789");  
bd = bd.setScale(2, RoundingMode.HALF_UP);  
System.out.println(bd);  
  
}  
}

使用BigDecimal保留小数点后2位数字,其有四舍五入

备注: RoundingMode提供了多种四舍五入的方法

(1)ROUND_UP

(2)ROUND_DOWN

(3)

BigDecimal保留精度


public class BigDecimal2Demo {  
  
public static void main(String[] args) {  
BigDecimal bd = new BigDecimal("1.23456789");  
BigDecimal bd1 = new BigDecimal("1.23456789");  
BigDecimal bigDecimal = bd.add(bd1);  
System.out.println(bigDecimal);  
  
}  
}

使用字符串的形式构造BigDecimal

BigDecimal精度缺失

BigDecimal也会造成精度缺失,如

public class BigDecimal3Demo {  
  
public static void main(String[] args) {  
BigDecimal bigDecimal = new BigDecimal(1.23456789);  
System.out.println(bigDecimal);  
  
}  
}

输出结果为:

image.png 所以不推荐使用double等构造,推荐使用字符串构造BigDecimal

BigDecimal比较

BigDecimal比较比较实用compareTo方法,如

public class BigDecimal1Demo {  
  
public static void main(String[] args) {  
BigDecimal bd1 = new BigDecimal("1.0");  
BigDecimal bd2 = new BigDecimal("1.00");  
System.out.println(bd1.compareTo(bd2));  
  
}  
}

输出结果为:

image.png 不推荐使用equals比较,因为不准,如

public class BigDecimal1Demo {  
  
public static void main(String[] args) {  
BigDecimal bd1 = new BigDecimal("1.0");  
BigDecimal bd2 = new BigDecimal("1.00");  
System.out.println(bd1.compareTo(bd2));  
System.out.println(bd1.equals(bd2));  
  
}  
}

输出结果为:

image.png

总结

总之,BigDecimal可以用于浮点数的计算,防止精度缺失,但是使用的时候也要注意使用String构造