《Java编程艺术》章节选登。作者:高永强 清华大学出版社 (即将出版)
5.8 BigDecimal类
双精度浮点型变量
double
可以处理
16
位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。
Java
在
java.math
包中提供的
API
类
BigDecimal
,用来对超过
16
位有效位的数进行精确的运算。表
5.7
中列出了
BigDecimal
类的主要构造器和方法。
表
5.7 BigDecimal
类的主要构造器和方法
构
造
器
|
描
述
|
BigDecimal(int)
|
创建一个具有参数所指定整数值的对象。
|
BigDecimal(double)
|
创建一个具有参数所指定双精度值的对象。
|
BigDecimal(long)
|
创建一个具有参数所指定长整数值的对象。
|
BigDecimal(String)
|
创建一个具有参数所指定以字符串表示的数值的对象。
|
续表
方
法
|
描
述
|
add(BigDecimal)
|
BigDecimal
对象中的值相加,然后返回这个对象。
|
subtract(BigDecimal)
|
BigDecimal
对象中的值相减,然后返回这个对象。
|
multiply(BigDecimal)
|
BigDecimal
对象中的值相乘,然后返回这个对象。
|
divide(BigDecimal)
|
BigDecimal
对象中的值相除,然后返回这个对象。
|
toString()
|
将
BigDecimal
对象的数值转换成字符串。
|
doubleValue()
|
将
BigDecimal
对象中的值以双精度数返回。
|
floatValue()
|
将
BigDecimal
对象中的值以单精度数返回。
|
longValue()
|
将
BigDecimal
对象中的值以长整数返回。
|
intValue()
|
将
BigDecimal
对象中的值以整数返回。
|
注意,由于一般数值类型,例如
double
,不能准确地代表
16
位有效数以上的数字,在使用
BigDecimal
时,应用
BigDecimal(String)
构造器创建对象才有意义。另外,
BigDecimal
所创建的是对象,我们不能使用传统的
+
、
-
、
*
、
/
等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是
BigDecimal
的对象。
构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。关于构造器概念和编写技术,将在本书第
6
章详细介绍。
下面讨论
BigDecimal
的一些常用例子:
//
完整程序例子在本书配套资源目录
Ch5
中名为
BigDecimalTestApp.java
//
创建
BigDecimal
对象
BigDecimal bigNumber = new BigDecimal(
"89.1234567890123456789");
BigDecimal bigRate = new BigDecimal(1000);
BigDecimal bigResult = new BigDecimal(); //
对象
bigResult
的值为
0.0
//
对
bigNumber
的值乘以
1000
,结果
赋予
bigResult
bigResult = bigNumber.multiply(bigRate);
System.out.println(bigResult.toString());
// 或者 System.out. println(bigResult);
// 或者 System.out. println(bigResult);
//
显示结果:
89123.4567890123456789000
//
以双精度数返回
bigNumber
中的值
double dData = bigNumber.doubleValue();
System.out.println(dData); //
结果:
89.12345678901235
注意使用方法
doubleValue()
将对象
bigNumber
中的值以双精度数值返回时,将丢失数据的准确性。使用其他方法,如
xxxValue()
时均存在这个问题,使用时必须慎重。
3W BigDecimal
用来对超过
16
有效位以上的数值进行运算和操作。所有的算术运算都通过调用其相应的方法进行。
创建一个超过
16
有效位数的对象时,运用
BigDecimal(String)
才可避免丢失数字的精确度。
5.9 BigDecimal和格式化
由于
NumberFormat
类的
format()
方法可以使用
BigDecimal
对象作为其参数,可以利用
BigDecimal
对超出
16
位有效数字的货币值,百分值,以及一般数值进行格式化控制。
以利用
BigDecimal
对货币和百分比格式化为例。首先,创建
BigDecimal
对象,进行
BigDecimal
的算术运算后,分别建立对货币和百分比格式化的引用,最后利用
BigDecimal
对象作为
format()
方法的参数,输出其格式化的货币值和百分比,即:
//
完整程序例子在本书配套资源目录
Ch5
中名为
BigDecimalFormatApp.java
BigDecimal bigLoanAmount = new BigDecimal(loanAmountString);
// 创建 BigDecimal 对象
// 创建 BigDecimal 对象
BigDecimal bigInterestRate = new BigDecimal(interestRateString);
BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate);
//BigDecimal 运算
//BigDecimal 运算
NumberFormat currency = NumberFormat.getCurrencyInstance();
// 建立货币格式化引用
// 建立货币格式化引用
NumberFormat percent = NumberFormat.getPercentInstance();
// 建立百分比格式化引用
// 建立百分比格式化引用
percent.setMaximumFractionDigits(3); //
百分比小数点最多
3
位
//
利用
BigDecimal
对象作为参数在
format()
中调用货币和百分比格式化
System.out.println("Loan amount:\t" + currency.format(bigLoanAmount));
System.out.println("Interest rate:\t" + percent.format(bigInterestRate));
System.out.println("Interest:\t" + currency.format(bigInterest));
如下是这个程序运行会的一个典型输出结果:
Loan amount:
¥
129,876,534,219,876,523.12
Interest rate: 8.765%
Interest:
¥
11,384,239,549,149,661.69