java中BigDecimal的介绍及使用
一、BigDecimal概述
BigDecimal是Java在java.math包中提供的线程安全的API类。BigDecimal是Java中用于表示任意精度数字的类,它可以表示无限长度的小数,BigDecimal 通常支持任意位数的小数部分,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二、BigDecimal常用构造方法
方法 | 含义 |
---|---|
BigDecimal(int val) | 创建一个具有参数所指定整数值的对象。 |
BigDecimal(double val) | 创建一个具有参数所指定双精度值的对象。不推荐使用,因为存在精度丢失问题 |
BigDecimal(long val) | 创建一个具有参数所指定长整数值的对象。 |
BigDecimal(String val) | 创建一个具有参数所指定以字符串表示的数值的对象。 推荐使用 |
三、BigDecimal常用方法
注意:BigDecimal进行运算时必须要保证对象本身不能是null,否则就会抛空指针异常。
方法 | 含义 |
---|---|
add(BigDecimal) | BigDecimal对象中的值相加,返回BigDecimal对象 |
subtract(BigDecimal) | BigDecimal对象中的值相减,返回BigDecimal对象 |
multiply(BigDecimal) | BigDecimal对象中的值相乘,返回BigDecimal对象 |
divide(BigDecimal) | BigDecimal对象中的值相除,返回BigDecimal对象。该方法可能会遇到无限精度问题,会抛出异常,使用时需注意。详细见下方的无限精度的坑 |
abs() | 将BigDecimal对象中的值转换成绝对值 |
doubleValue() | 将BigDecimal对象中的值转换成双精度数 |
floatValue() | 将BigDecimal对象中的值转换成单精度数 |
longValue() | 将BigDecimal对象中的值转换成长整数 |
intValue() | 将BigDecimal对象中的值转换成整数 |
compareTo(BigDecimal val) | 比较大小,返回int类型。0(相等) 1(大于) -1(小于) |
toString() | 有必要时使用科学计数法。 |
toPlainString() | 不使用任何指数。推荐使用 |
toEngineeringString() | 有必要时使用工程计数法。 工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数 |
max(BigDecimal val) | 两值比较,返回最大值 |
negate() | 求相反数,正变负,负变正 |
pow(int n) | 求乘方,如BigDecimal.valueOf(2).pow(3)的值为8 |
代码示例
import java.math.BigDecimal;
public class Test {
public static void main(String[] args){
BigDecimal b1 = new BigDecimal("1");
BigDecimal b2 = new BigDecimal("2");
BigDecimal b3 = new BigDecimal("4");
System.out.println("相加:"+b1.add(b2));
System.out.println("相减:"+b1.subtract(b2));
System.out.println("相乘:"+b2.multiply(b3));
System.out.println("相除:"+b2.divide(b3));
}
}