background image

本篇主要介绍的是我们在日常开发中经常用到的 JDK 对象,这里进行了一些分类性总结
和差异比较。由于这里涉及的很多工具类都是大家耳熟能详的,因此不会长篇大论的介绍
每一个概念和细节,我们还是继续秉承该系列的风格,通过更多实用的可执行的示例代
码和关键性注释来阐述他们的功能和技术细节,让我们现在就开始吧。

  大数值对象(BigDecimal)
  和普通的原始类型相比,该类主要提供以下几点优势:
  ①可以表示任意大十进制数值;

 

  ② 提供了基本的数学函数,同时也支持各种数学运算符;

 

  ③ 提供了与字符串(String)和原始数值类型之间的各种转换;

 

  ④ 与 double 和 Double 相比,在进行浮点运算时不丢失精度;

 

  ⑤ 提供可靠的四舍五入表示。
  那么的劣势又是什么呢?性能!因此如果我们的系统需要进行大量的科学计算,那么
BigDecimal 将不是一个很好的选择,特别是对那些高密度计算的程序,在这种情况下
我们的首选还是原始数据类型。因此 BigDecimal 更适用于基于商业规则的运算程序,如
保单和利息等。
  下面将给出几个比较典型的应用示例:

 

  ① BigDecimal 与 String 和任意数值类型的转换:
 1     public static void main(String args[]) {
 2         BigDecimal bd1 = new BigDecimal("123456789.0123456890");
 3         BigDecimal bd2 = BigDecimal.valueOf(123L);
 4         bd1 = bd1.add(bd2);
 5         System.out.println(bd2.toPlainString());
 6         BigDecimal bd3 = new BigDecimal(bd2.toPlainString());
 7         if (bd3.equals(bd2))
 8             System.out.println("bd2 is equal to bd3");
 9         if (bd2.intValue() == 123)
10             System.out.println("bd2 is equal to 123.");
11     }
12     /*    输出结果如下:
13         123
14         bd2 is equal to bd3
15         bd2 is equal to 123.
16     */    
  由上例的输出结果可见,BigDecimal 中提供了各种类型之间的可传递性转换,既
上例中的 bd2 对象,源于 123L,然后再将该对象转换会原始类型时,得到的值和之前
初始化该对象的值仍然是相等的。上例中还用将 bd2 转换为字符串,并用该结果构造了
另外一个 BigDecimal 对象,在比较这个两个对象的值时,发现他们是相等的。这种可传
递性的类型之间的转换,Effective Java 的作者是比较推崇的。

 

  ② 基本的数学运算和数学函数应用:
1     public static void main(String args[]) {
2 BigDecimal bd1 = new BigDecimal("123456789.0123456890");
3         BigDecimal bd2 = BigDecimal.valueOf(123L);
4         bd1 = bd1.add(bd2);