【代码】
1 System.out.println(0.09 + 0.01); 2 System.out.println(0.1 - 0.32); 3 System.out.println(1.015 * 100); 4 System.out.println(1.301 / 100);
【运行结果】
1 0.09999999999999999 2 -0.22 3 101.49999999999999 4 0.013009999999999999
【分析】
为什么和我们预想的不一样呢?借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
【BigDecimal的构造方法】
1)BigDecimal(String val) :将 BigDecimal 的字符串表示形式转换为 BigDecimal。
注:这里只推荐用一种String参数的构造方法,因为其他的构造方法多少都具有一些不可预知性。。。
【常用方法】
1)add(BigDecimal augend) :返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。(这里的标度就是小数点后取几位的意思)
2)subtract(BigDecimal subtrahend) :返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
3)multiply(BigDecimal multiplicand) :返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。
4)divide(BigDecimal divisor) :返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。
5)divide(BigDecimal divisor, int scale, int roundingMode) :返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。
【例】
1 BigDecimal bd1 = new BigDecimal("1.031"); 2 BigDecimal bd2 = new BigDecimal("100"); 3 System.out.println(bd1.divide(bd2, 3, BigDecimal.ROUND_HALF_UP));
【运行结果】
1 0.010
【分析】
最后一个除法的三个参数分别是:除数、小数点后保留几位,取舍方式(这里用的是向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。)