天天看點

如何應用Java的BigDecimal類

《Java程式設計藝術》章節選登。作者:高永強 清華大學出版社 (即将出版)

雙精度浮點型變量double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精确的運算。表5.7中列出了BigDecimal類的主要構造器和方法。

表5.7  BigDecimal類的主要構造器和方法

構  造  器

描    述

BigDecimal(int)

建立一個具有參數所指定整數值的對象。

BigDecimal(double)

建立一個具有參數所指定雙精度值的對象。

BigDecimal(long)

建立一個具有參數所指定長整數值的對象。

BigDecimal(String)

建立一個具有參數所指定以字元串表示的數值的對象。

續表

方    法

add(BigDecimal)

BigDecimal對象中的值相加,然後傳回這個對象。

subtract(BigDecimal)

BigDecimal對象中的值相減,然後傳回這個對象。

multiply(BigDecimal)

BigDecimal對象中的值相乘,然後傳回這個對象。

divide(BigDecimal)

BigDecimal對象中的值相除,然後傳回這個對象。

toString()

将BigDecimal對象的數值轉換成字元串。

doubleValue()

将BigDecimal對象中的值以雙精度數傳回。

floatValue()

将BigDecimal對象中的值以單精度數傳回。

longValue()

将BigDecimal對象中的值以長整數傳回。

intValue()

将BigDecimal對象中的值以整數傳回。

注意,由于一般數值類型,例如double,不能準确地代表16位有效數以上的數字,在使用BigDecimal時,應用BigDecimal(String)構造器建立對象才有意義。另外,BigDecimal所建立的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。

構造器是類的特殊方法,專門用來建立對象,特别是帶有參數的對象。關于構造器概念和編寫技術,将在本書第6章詳細介紹。

下面讨論BigDecimal的一些常用例子:

//完整程式例子在本書配套資源目錄Ch5中名為BigDecimalTestApp.java

//建立BigDecimal對象

BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");

BigDecimal bigRate = new BigDecimal(1000);

BigDecimal bigResult = new BigDecimal(); //對象bigResult的值為0.0

//對bigNumber的值乘以1000,結果 賦予bigResult

bigResult = bigNumber.multiply(bigRate); 

System.out.println(bigResult.toString());   

//或者System.out.println(bigResult);

//顯示結果:89123.4567890123456789000

//以雙精度數傳回bigNumber中的值

double dData = bigNumber.doubleValue(); 

System.out.println(dData);          //結果:89.12345678901235

       注意使用方法doubleValue()将對象bigNumber中的值以雙精度數值傳回時,将丢失資料的準确性。使用其他方法,如xxxValue()時均存在這個問題,使用時必須慎重。

3W  BigDecimal用來對超過16有效位以上的數值進行運算和操作。所有的算術運算都通過調用其相應的方法進行。建立一個超過16有效位數的對象時,運用BigDecimal(String)才可避免丢失數字的精确度。

       由于NumberFormat類的format()方法可以使用BigDecimal對象作為其參數,可以利用BigDecimal對超出16位有效數字的貨币值,百分值,以及一般數值進行格式化控制。

       以利用BigDecimal對貨币和百分比格式化為例。首先,建立BigDecimal對象,進行BigDecimal的算術運算後,分别建立對貨币和百分比格式化的引用,最後利用BigDecimal對象作為format()方法的參數,輸出其格式化的貨币值和百分比,即:

//完整程式例子在本書配套資源目錄Ch5中名為BigDecimalFormatApp.java

BigDecimal bigLoanAmount = new BigDecimal(loanAmountString);

                                //建立BigDecimal對象

BigDecimal bigInterestRate = new BigDecimal(interestRateString);   

BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate);

                                //BigDecimal運算

NumberFormat currency = NumberFormat.getCurrencyInstance();

                                //建立貨币格式化引用

NumberFormat percent = NumberFormat.getPercentInstance();

                                //建立百分比格式化引用

percent.setMaximumFractionDigits(3);     //百分比小數點最多3位

//利用BigDecimal對象作為參數在format()中調用貨币和百分比格式化

System.out.println("Loan amount:\t" + currency.format(bigLoanAmount));

System.out.println("Interest rate:\t" + percent.format(bigInterestRate));

System.out.println("Interest:\t" + currency.format(bigInterest));

如下是這個程式運作會的一個典型輸出結果:

Loan amount:    ¥129,876,534,219,876,523.12

Interest rate:  8.765%

Interest:   ¥11,384,239,549,149,661.69

本文轉自高永強51CTO部落格,原文連結:http://blog.51cto.com/yqgao/157050 ,如需轉載請自行聯系原作者

上一篇: ansible-playbook
下一篇: haproxy