一、BigDecimal概述
BigDecimal是Java常用的API之一,位于java.math.BigDecimal包下,常用于需要精确计算数据的场景中,例如涉及到订单金额和银行账务数据等场景。
二、BigDecimal优缺点
相比较于单精度浮点型变量float和双精度浮点型变量double,BigDecimal有如下优点
优点:单精度浮点型变量float可以处理7位有效数,双精度浮点型变量double可以处理16位有效数,BigDecimal可以处理任意大小且精度完全准确的浮点数。
缺点:BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。
三、常用方法
3.1.1、BigDecimal(int)
创建一个具有参数所指定整数值的对象
3.1.2、BigDecimal(long)
创建一个具有参数所指定长整数值的对象
3.1.3、BigDecimal(String)
创建一个具有参数所指定以字符串表示的数值的对象
3.1.4、BigDecimal(double)
创建一个具有参数所指定双精度值的对象,不推荐使用
BigDecimal first = new BigDecimal("0.12");
BigDecimal second = new BigDecimal(0.12);
System.out.println("first is:" + first);
System.out.println("second is:" + second);
first is:0.12
second is:0.11999999999999999555910790149937383830547332763671875
四、其他常用方法
实例:
import java.math.BigDecimal;
public class LearnBigDecimal {
public static void main(String[] args) {
// BigDecimal的构造方法
BigDecimal first = new BigDecimal("123.345");
BigDecimal second = new BigDecimal("0.120");
System.out.println("first:" + first);
System.out.println("second:" + second);
// scale():获取BigDecimal对象小数点后位数,返回值为负数表示这个数是个整数
System.out.println("first小数点后位数:" + first.scale());
System.out.println("second小数点后位数:" + second.scale());
// 将second格式化为一个相等的,但去掉了末尾0的BigDecimal对象third
BigDecimal third = second.stripTrailingZeros();
System.out.println("third:" + third);
// 加、减、乘
System.out.println("first + second = " + first.add(second));
System.out.println("first - second = " + first.subtract(second));
System.out.println("first * second = " + first.multiply(second));
// 除法存在无法除尽的情况,需要指定精度以及如何进行截断,否则抛异常:ArithmeticException
BigDecimal divideValue = first.divide(second, 10, BigDecimal.ROUND_HALF_UP);
System.out.println("first / second = " + divideValue);
// 模运算
BigDecimal remainderValue = first.remainder(second);
System.out.println("first % second = " + remainderValue);
// 四舍五入 0表示小数点后位数为0
BigDecimal value1 = first.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("first四舍五入后值为:" + value1);
// 直接截断 2表示小数点后位数为2
BigDecimal value2 = first.setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println("first直接截断后值为:" + value2);
// 使用compareTo()比较BigDecimal对象值的大小
if (first.compareTo(second) > 0) {
System.out.println("first > second");
} else if (first.compareTo(second) == 0) {
System.out.println("first = second");
} else {
System.out.println("first < second");
}
}
}
first:123.345
second:0.120
first小数点后位数:3
second小数点后位数:3
third:0.12
first + second = 123.465
first - second = 123.225
first * second = 14.801400
first / second = 1027.8750000000
first % second = 0.105
first四舍五入后值为:123
first直接截断后值为:123.34
first > second