对于BigDecimal来说,经常用于表示精确的浮点数。众所周知,对于doule和float来说,使用的是科学计数法来表示的浮点数,因此会出现不准确的情况。这时候可以使用BigDecimal来代替。下面就简单介绍一下BigDecimal的相关用法。
BigDeimcal的构造器很多,有传入字符数组的,有传入字符串的,有传入BigInteger对象的,有double浮点数的,还有传入int或long类型整数的。
public BigDecimal(char[] in):根据字符数组来构造,前提是所有的字符都是数字。
public BigDecimal(char[] in, MathContext mc):根据指定的字符数组和数学上下文来构造,当然,前提是所有的字符都是数字。
public BigDecimal(char[] in, int offset, int len):在指定的字符数组中通过偏移量加长度来获取部分字符构造,前提是字符数组都是数字。
public BigDecimal(char[] in, int offset, int len, MathContext mc):在指定的字符数组中通过偏移量加长度来获取部分字符并加上数学上下文构造,前提是字符数组都是数字。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
char[] numChs = "123456.789".toCharArray();
// public BigDecimal(char[] in)
BigDecimal b1 = new BigDecimal(numChs);
System.out.println("b1的值为:" + b1);
// public BigDecimal(char[] in, MathContext mc)
BigDecimal b2 = new BigDecimal(numChs, new MathContext(8, RoundingMode.FLOOR));
System.out.println("b2的值为:" + b2);
// public BigDecimal(char[] in, int offset, int len)
BigDecimal b3 = new BigDecimal(numChs, 4, 4);
System.out.println("b3的值为:" + b3);
// public BigDecimal(char[] in, int offset, int len, MathContext mc)
BigDecimal b4 = new BigDecimal(numChs, 4, 5, new MathContext(3, RoundingMode.CEILING));
System.out.println("b4的结果为:" + b4);
}
}
执行结果如下图所示:
public BigDecimal(String val):根据指定的字符串来构造
public BigDecimal(String val, MathContext mc):根据指定的字符串加数学上下文来构造
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
String str = "7897.452";
// public BigDecimal(String val)
BigDecimal b1 = new BigDecimal(str);
System.out.println("b1的值为:" + b1);
// public BigDecimal(String val, MathContext mc)
BigDecimal b2 = new BigDecimal(str, new MathContext(6, RoundingMode.CEILING));
System.out.println("b2的值为:" + b2);
}
}
执行结果如下图所示:
public BigDecimal(double val):根据double类型浮点数来构造
public BigDecimal(double val, MathContext mc):根据double类型浮点数加数学上下文对象来构造
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
// public BigDecimal(double val)
BigDecimal b1 = new BigDecimal(12.67);
System.out.println("b1的值为:" + b1);
// public BigDecimal(double val, MathContext mc)
BigDecimal b2 = new BigDecimal(12.67, new MathContext(5, RoundingMode.CEILING));
System.out.println("b2的值为:" + b2);
}
}
执行结果如下图所示:
由执行结果可以看出,使用接收double类型的构造器得到的BigDecimal对象与我们预料中的有所出入。因为不管是double还是float,都不是精确值,而是使用科学计数法表示的近似值。因此尽量避免使用该构造器来创建对象。
public BigDecimal(BigInteger val):根据BigInteger来构造
public BigDecimal(BigInteger val, MathContext mc):根据BigInteger和数学上下文来构造。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
// public BigDecimal(BigInteger val)
BigDecimal b1 = new BigDecimal(BigInteger.valueOf(12));
System.out.println("b1的值为:" + b1);
// public BigDecimal(BigInteger val, MathContext mc)
BigDecimal b2 = new BigDecimal(BigInteger.valueOf(13), new MathContext(3));
System.out.println("b2的值为:" + b2);
}
}
执行结果如下图所示:
传入int或long类型的整数
public BigDecimal(int val) :根据一个int类型的整数来构造。
public BigDecimal(int val, MathContext mc):根据一个int类型的整数加数学上下文来构造。
public BigDecimal(long val):根据一个long类型的整数来构造。
public BigDecimal(long val, MathContext mc):根据一个long类型的整数加数学上下文对象来构造。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
//public BigDecimal(int val)
BigDecimal b1 = new BigDecimal(123);
System.out.println("b1的值为:" + b1);
// public BigDecimal(int val, MathContext mc)
BigDecimal b2 = new BigDecimal(123, new MathContext(3));
System.out.println("b2的值为:" + b2);
//public BigDecimal(long val)
BigDecimal b3 = new BigDecimal(123L);
System.out.println("b1的值为:" + b3);
// public BigDecimal(long val, MathContext mc)
BigDecimal b4 = new BigDecimal(123L, new MathContext(3));
System.out.println("b2的值为:" + b4);
}
}
执行结果如下图所示:
说完了构造器,我们再来简单说说BigDecimal常用的方法。
public BigDecimal add(BigDecimal augend):两个BigDecimal对象相加的值
public BigDecimal add(BigDecimal augend, MathContext mc):两个BigDecimal对象相加的值,并使用数学上下文进行处理
public BigDecimal subtract(BigDecimal subtrahend):两个BigDecimal对象相减的值
public BigDecimal subtract(BigDecimal subtrahend, MathContext mc):两个BigDecimal对象相减的值,并使用数学上下文进行处理
public BigDecimal multiply(BigDecimal multiplicand):两个BigDecimal对象相乘的值。
public BigDecimal multiply(BigDecimal multiplicand, MathContext mc):两个BigDecimal对象相乘的值,并使用数学上下文进行处理
public BigDecimal divide(BigDecimal divisor):两个BigDecimal对象相除的值。
public BigDecimal divide(BigDecimal divisor, MathContext mc):两个BigDecimal对象相除的值,并使用数学上下文进行处理。
public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) :两个BigDecimal对象相除的值,并使用指定的舍入模式来处理。
public BigDecimal remainder(BigDecimal divisor):两个BigDecimal对象进行求余
public BigDecimal remainder(BigDecimal divisor, MathContext mc):两个BigDecimal对象进行求余,并通过数学上下文进行运算。(如何舍入)
public BigDecimal[] divideAndRemainder(BigDecimal divisor):求两个BigDecimal对象的商和余数。
public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc):求两个BigDecimal对象的商和余数,并通过数学上下文进行运算(如何舍入)
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(23.42);
BigDecimal b2 = BigDecimal.valueOf(12.51);
// public BigDecimal add(BigDecimal augend)
System.out.println("b1 + b2 = " + b1.add(b2));
// public BigDecimal add(BigDecimal augend, MathContext mc)
System.out.println("b1 + b2 = " + b1.add(b2, new MathContext(3, RoundingMode.CEILING)));
// public BigDecimal subtract(BigDecimal subtrahend)
System.out.println("b1 - b2 = " + b1.subtract(b2));
// public BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
System.out.println("b1 - b2 = " + b1.subtract(b2, new MathContext(3, RoundingMode.FLOOR)));
// public BigDecimal multiply(BigDecimal multiplicand)
System.out.println("b1 * b2 = " + b1.multiply(b2));
// public BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
System.out.println("b1 * b2 = " + b1.multiply(b2, new MathContext(6, RoundingMode.CEILING)));
// public BigDecimal divide(BigDecimal divisor)
System.out.println("b1 / 2 = " + b1.divide(BigDecimal.valueOf(2)));
// public BigDecimal divide(BigDecimal divisor, MathContext mc)
System.out.println("b1 / 3 = " + b1.divide(BigDecimal.valueOf(3), new MathContext(9)));
// public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
System.out.println("b1 / 3 = " + b1.divide(BigDecimal.valueOf(3), RoundingMode.CEILING));
// public BigDecimal remainder(BigDecimal divisor)
System.out.println("b1对b2求余结果是:" + b1.remainder(b2));
// public BigDecimal remainder(BigDecimal divisor, MathContext mc)
System.out.println("b1对b2求余结果是:" + b1.remainder(b2, new MathContext(3, RoundingMode.CEILING)));
// public BigDecimal[] divideAndRemainder(BigDecimal divisor)
System.out.println("b1对b2求商和余数的结果为:" + Arrays.toString(b1.divideAndRemainder(b2)));
// public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
System.out.println("b1对b2求商和余数的结果为:" + Arrays.toString(b1.divideAndRemainder(b2, new MathContext(
3, RoundingMode.CEILING))));
}
}
执行结果如下图所示:
需要说明一下的是,使用BigDecimal的除法的时候,如果无法除尽,必须通过MathContext来设置保留小数位数,否则会抛出异常。
public BigDecimal setScale(int newScale):设置小数位数
public BigDecimal setScale(int newScale, RoundingMode roundingMode):设置小数位数,并传入进行舍入方式的数学上下文
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(12.346);
// 当设置的小数位数小于该数实际的小数位数,且未设置舍入模式时会报异常。
// System.out.println("设置小数位数为2位:" + b1.setScale(2));
System.out.println("设置小数位数为2位:" + b1.setScale(2, RoundingMode.FLOOR));
}
}
执行结果如下图所示:
public BigDecimal max(BigDecimal val):取两个数的最大值
public BigDecimal min(BigDecimal val):取两个数的最小值。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(12.34);
BigDecimal b2 = BigDecimal.valueOf(34.21);
System.out.println("b1和b2中最大的数为:" + b1.max(b2));
System.out.println("b1和b2中最小的数为:" + b1.min(b2));
}
}
执行结果如下图所示:
public byte byteValue() :获取其对应的byte值。
public short shortValue() :获取其对应的short值。
public int intValue():获取其对应的int值。
public long longValue():获取其对应的long值。
public float floatValue():获取其对应的float值。
public double doubleValue():获取其对应的double值。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(12.34);
System.out.println("b1转换为byte类型为:" + b1.byteValue());
System.out.println("b1转换为short类型为:" + b1.shortValue());
System.out.println("b1转换为int类型为:" + b1.intValue());
System.out.println("b1转换为long类型为:" + b1.longValue());
System.out.println("b1转换为float类型为:" + b1.floatValue());
System.out.println("b1转换为double类型为:" + b1.doubleValue());
}
}
执行结果如下图所示:
public BigDecimal movePointLeft(int n):向左移动指定位数
ublic BigDecimal movePointRight(int n):向右移动指定位数。
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(12.34);
System.out.println("b1小数点向左移动两位的结果为:" + b1.movePointLeft(2));
System.out.println("b1小数点向右移动两位的结果为:" + b1.movePointRight(2));
}
}
执行结果如下图所示:
public BigDecimal abs() :取绝对值。
public BigDecimal abs(MathContext mc):取绝对值并通过传入的数学上下文来进行运算。
public BigDecimal negate() :对该对象取反
public BigDecimal negate(MathContext mc):对该对象取反,并通过传入的数学上下文来进行运算。
public BigDecimal pow(int n):计算该对象的平方。
public BigDecimal pow(int n, MathContext mc):计算该对象的平方,并根据传入的数学上下文进行对应的运算。
public int precision():设置总共所占位数
public BigDecimal round(MathContext mc):根据指定的数学上下文来进行运算。
public int scale():获取该BigDecimal对象所占位数。
public int signum():获取该对象的符号,1表示正,-1表示负
示例代码如下所示:
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = BigDecimal.valueOf(12.34);
BigDecimal b2 = BigDecimal.valueOf(-12.34);
System.out.println("b2的绝对值为:" + b2.abs());
System.out.println("b2的绝对值为:" + b2.abs(new MathContext(3, RoundingMode.CEILING)));
System.out.println("b1取反结果为:" + b1.negate());
System.out.println("b1取反结果为:" + b1.negate(new MathContext(3, RoundingMode.CEILING)));
System.out.println("1.2的平方为:" + BigDecimal.valueOf(1.2).pow(2));
System.out.println("1.2的平方为:" + BigDecimal.valueOf(1.2).pow(2, new MathContext(2, RoundingMode.FLOOR)));
System.out.println("b1占多少位:" + b1.precision());
System.out.println("b1的小数位数:" + b1.scale());
System.out.println("b1的符号为:" + b1.signum());
}
}
执行结果如下图所示: