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