1. 程式人生 > >BigDecimal的引入和概述

BigDecimal的引入和概述

divide sca 。。 ima ive trac 向上 iso 指定

代碼

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

分析

最後一個除法的三個參數分別是:除數、小數點後保留幾位,取舍方式(這裏用的是向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。)

BigDecimal的引入和概述