1.在定義字段要求精度比較高的時(shí)候,一般會(huì)使用BigDecimal類(lèi)型。
2.常用構(gòu)造函數(shù)
BigDecimal(int)創(chuàng)建一個(gè)具有參數(shù)所指定整數(shù)值的對(duì)象
BigDecimal(double)創(chuàng)建一個(gè)具有參數(shù)所指定雙精度值的對(duì)象
BigDecimal(long)創(chuàng)建一個(gè)具有參數(shù)所指定長(zhǎng)整數(shù)值的對(duì)象
BigDecimal(String)創(chuàng)建一個(gè)具有參數(shù)所指定以字符串表示的數(shù)值的對(duì)象
可以直接在創(chuàng)建BigDecimal對(duì)象并傳入相應(yīng)的不同類(lèi)型的值,但是在傳入float和double類(lèi)型的值時(shí),會(huì)出現(xiàn)一些不可預(yù)知的情況。
double aa = 0.1116666;
BigDecimal bb = new BigDecimal(aa);
System.out.println("bb的值為"+bb);
結(jié)果如下:
bb的值為0.111666600000000004744293846670188941061496734619140625
原因分析:
1)參數(shù)類(lèi)型為double的構(gòu)造方法的結(jié)果有一定的不可預(yù)知性。有人可能認(rèn)為在Java中寫(xiě)入newBigDecimal(0.1116666)所創(chuàng)建的BigDecimal正好等于 0.1116666,但是它實(shí)際上等于0.111666600000000004744293846670188941061496734619140625。這是因?yàn)?code>0.1116666無(wú)法準(zhǔn)確地表示為 double(或者說(shuō)對(duì)于該情況,不能表示為任何有限長(zhǎng)度的二進(jìn)制小數(shù))。傳入到構(gòu)造方法的值不會(huì)正好等于 0.1116666(雖然表面上等于該值)。
2)String構(gòu)造方法是完全可預(yù)知的:寫(xiě)入 newBigDecimal(“0.1116666”)將創(chuàng)建一個(gè) BigDecimal,它正好等于預(yù)期的0.1116666。因此,比較而言, 通常建議優(yōu)先使用String構(gòu)造方法。
3)當(dāng)把一個(gè)Double類(lèi)型的ddouble轉(zhuǎn)成BigDeciamal的時(shí)候,可以先使用Double.toString(double)方法或者String.valueOf(double)方法將double轉(zhuǎn)成String類(lèi)型,再調(diào)用BigDeciamal的參數(shù)為String類(lèi)型的構(gòu)造方法,這樣就等于實(shí)際值了。
3.、BigDecimal常用方法詳解
1)常用方法
add(BigDecimal) :BigDecimal對(duì)象中的值相加,返回BigDecimal對(duì)象
subtract(BigDecimal): BigDecimal對(duì)象中的值相減,返回BigDecimal對(duì)象
multiply(BigDecimal):BigDecimal對(duì)象中的值相乘,返回BigDecimal對(duì)象
divide(BigDecimal):BigDecimal對(duì)象中的值相除,返回BigDecimal對(duì)象
toString():將BigDecimal對(duì)象中的值轉(zhuǎn)換成字符串
doubleValue():將BigDecimal對(duì)象中的值轉(zhuǎn)換成雙精度數(shù)
floatValue():將BigDecimal對(duì)象中的值轉(zhuǎn)換成單精度數(shù)
longValue():將BigDecimal對(duì)象中的值轉(zhuǎn)換成長(zhǎng)整數(shù)
intValue():將BigDecimal對(duì)象中的值轉(zhuǎn)換成整數(shù)
2)、BigDecimal大小比較
java中對(duì)BigDecimal比較大小一般用的是bigdemical的compareTo方法
int a = bigdemical.compareTo(bigdemical2)
返回結(jié)果分析:
a = -1, 表示bigdemical小于bigdemical2;
a = 0, 表示bigdemical等于bigdemical2;
a = 1, 表示bigdemical大于bigdemical2;
舉例:a大于等于b
new bigdemica(a).compareTo(new bigdemical(b)) >= 0
4、BigDecima````格式化 由于NumberFormat類(lèi)的format()方法可以使用BigDecimal對(duì)象作為其參數(shù),可以利用BigDecimal```對(duì)超出16位有效數(shù)字的貨幣值,百分值,以及一般數(shù)值進(jìn)行格式化控制。
以利用BigDecimal對(duì)貨幣和百分比格式化為例。首先,創(chuàng)建BigDecimal對(duì)象,進(jìn)行BigDecimal的算術(shù)運(yùn)算后,分別建立對(duì)貨幣和百分比格式化的引用,最后利用BigDecimal對(duì)象作為format()方法的參數(shù),輸出其格式化的貨幣值和百分比。
NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立貨幣格式化引用
NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
percent.setMaximumFractionDigits(3); //百分比小數(shù)點(diǎn)最多3位
BigDecimal loanAmount = new BigDecimal("15000.48"); //貸款金額
BigDecimal interestRate = new BigDecimal("0.008"); //利率
BigDecimal interest = loanAmount.multiply(interestRate); //相乘
System.out.println("貸款金額:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));
結(jié)果:
貸款金額: ¥15,000.48 利率: 0.8% 利息: ¥120.00
5、BigDecimal總結(jié)
1).在需要精確的小數(shù)計(jì)算時(shí)再使用BigDecimal,BigDecimal的性能比double和float差,在處理龐大,復(fù)雜的運(yùn)算時(shí)尤為明顯。故一般精度的計(jì)算沒(méi)必要使用BigDecimal。
2).盡量使用參數(shù)類(lèi)型為String的構(gòu)造函數(shù)。