java中商业数据计算时用到的类BigDecimal和DecimalFormat
1.引言
????????借用《Effactive Java》這本書中的話,float和double類型的主要設計目標是為了科學計算和工程計算。他們執行二進制浮點運算,這是為了在廣域數值范圍上提供較為精確的快速近似計算而精心設計的。然而,它們沒有提供完全精確的結果,所以不應該被用于要求精確結果的場合。但是,商業計算往往要求結果精確,這時候BigDecimal就派上大用場啦。
2.BigDecimal簡介
????????BigDecimal 由任意精度的整數非標度值?和32 位的整數標度?(scale) 組成。如果為零或正數,則標度是小數點后的位數。如果為負數,則將該數的非標度值乘以 10 的負scale 次冪。因此,BigDecimal表示的數值是(unscaledValue × 10-scale)
3Bigdecimal用法詳解
Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是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對象中的值以整數返回。
格式化及例子
由于NumberFormat類的format()方法可以使用BigDecimal對象作為其參數,可以利用BigDecimal對超出16位有效數字的貨幣值,百分值,以及一般數值進行格式化控制。
以利用BigDecimal對貨幣和百分比格式化為例。首先,創建BigDecimal對象,進行BigDecimal的算術運算后,分別建立對貨幣和百分比格式化的引用,最后利用BigDecimal對象作為format()方法的參數,輸出其格式化的貨幣值和百分比。
public static void main(String[] args) {NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立貨幣格式化引用 NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用 percent.setMaximumFractionDigits(3); //百分比小數點最多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)); }運行結果如下:
貸款金額: ¥15,000.48 利率: 0.8% 利息: ¥120.00BigDecimal比較
BigDecimal是通過使用compareTo(BigDecimal)來比較的,具體比較情況如下:
打印結果是:-1、0、1,即左邊比右邊數大,返回1,相等返回0,比右邊小返回-1。
注意不能使用equals方法來比較大小。
使用BigDecimal的壞處是性能比double和float差,在處理龐大,復雜的運算時尤為明顯,因根據實際需求決定使用哪種類型。
4DecimalFormat用法詳解
DecimalFormat 是 NumberFormat 的一個具體子類,用于格式化十進制數字。DecimalFormat 包含一個模式 和一組符符號含義:?
0 一個數字?
# 一個數字,不包括 0?
. 小數的分隔符的占位符?
, 分組分隔符的占位符?
; 分隔格式。?
- 缺省負數前綴。?
% 乘以 100 和作為百分比顯示?
? 乘以 1000 和作為千進制貨幣符顯示;用貨幣符號代替;如果雙寫,用?
國際貨幣符號代替。如果出現在一個模式中,用貨幣十進制分隔符代?
替十進制分隔符。?
X 前綴或后綴中使用的任何其它字符,用來引用前綴或后綴中的特殊字符。?
例子:?
結果:?
12.3?
12.3?
012.340?
12.34
附加:(java中常見保留2位小數點方法)
方式一:
四舍五入??
double?? f?? =?? 111231.5585;??
BigDecimal?? b?? =?? new?? BigDecimal(f);??
double?? f1?? =?? b.setScale(2,?? BigDecimal.ROUND_HALF_UP).doubleValue();??
保留兩位小數??
---------------------------------------------------------------??
方式二:
java.text.DecimalFormat?? df?? =new?? java.text.DecimalFormat("#.00");??
df.format(你要格式化的數字);
例:new java.text.DecimalFormat("#.00").format(3.1415926)
#.00 表示兩位小數 #.0000四位小數 以此類推...
方式三:
double d = 3.1415926;
String result = String .format("%.2f");
%.2f %. 表示 小數點前任意位數?? 2 表示兩位小數 格式后的結果為f 表示浮點型
方式四:
NumberFormat ddf1=NumberFormat.getNumberInstance() ;
void setMaximumFractionDigits(int digits)?
digits 顯示的數字位數?
為格式化對象設定小數點后的顯示的最多位,顯示的最后位是舍入的
轉載于:https://www.cnblogs.com/wxishang1991/p/5405664.html
總結
以上是生活随笔為你收集整理的java中商业数据计算时用到的类BigDecimal和DecimalFormat的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用ionic快速开发hybird App
- 下一篇: JDBC基础学习(三)—处理BLOB类型