代码

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

分析

最后一个除法的三个参数分别是:除数、小数点后保留几位,取舍方式(这里用的是向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。)


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

BigInteger的使用知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。