java.math.BigDecimal的用法及加減乘除計(jì)算
java.math.BigDecimal及加減乘除計(jì)算
BigDecimal簡(jiǎn)介
- BigDecimal用來對(duì)需要更大或更小的數(shù)進(jìn)行任意精度的運(yùn)算。
- 在需要精確的小數(shù)計(jì)算時(shí)再使用BigDecimal,BigDecimal的性能比double和float差,在處理龐大,復(fù)雜的運(yùn)算時(shí)尤為明顯。故一般精度的計(jì)算沒必要使用BigDecimal。
- 盡量使用參數(shù)類型為String的構(gòu)造函數(shù)。
- BigDecimal都是不可變的(immutable)的, 在進(jìn)行每一次四則運(yùn)算時(shí),都會(huì)產(chǎn)生一個(gè)新的對(duì)象 ,所以在做加減乘除運(yùn)算時(shí)要記得要保存操作后的值。
BigDecimal構(gòu)造方法
BigDecimal(BigInteger val)
將 BigInteger轉(zhuǎn)換成 BigDecimal
BigDecimal(char[] in)
一個(gè)轉(zhuǎn)換的字符數(shù)組表示 BigDecimal成 BigDecimal ,接受字符作為的相同序列 BigDecimal(String)構(gòu)造
BigDecimal(double val)
將 double轉(zhuǎn)換為 BigDecimal ,這是 double的二進(jìn)制浮點(diǎn)值的精確十進(jìn)制表示
BigDecimal(int val)
將 int成 BigDecimal
BigDecimal(long val)
將 long成 BigDecimal
BigDecimal(String val)
將BigDecimal的字符串表示 BigDecimal轉(zhuǎn)換為 BigDecimal
BigDecimal 常用方法 加減乘除運(yùn)算
BigDecimal a = new BigDecimal(6); BigDecimal b = new BigDecimal(5); a.add(b); ?//a+b ?加 a.subtract(b); // a-b 減 a.multiply(b); // a*b 乘 a.divide(b);// a/b 除 a.doubleValue();//轉(zhuǎn)換成雙精度 double類型 a.floatValue(); //轉(zhuǎn)換成單精度 float類型 a.longValue(); //轉(zhuǎn)換成長(zhǎng)整形 long 類型 a.intValue(); ?//轉(zhuǎn)換成整形 int 類型 a.pow(3);//a的3次方 a.abs();//a的絕對(duì)值 a.negate();//a的負(fù)數(shù)
BigDecimal數(shù)值比較
BigDecimal a = new BigDecimal(6); int i = a.compareTo(BigDecimal.ZERO); //和0做比較 i==-1;//表示a小于0 i==0;//表示a=0 i==1;//表示a大于0 boolean b1 = a.subtract(b).compareTo(BigDecimal.ZERO) > 0;//判斷a-b是否大于0
BigDecimal常見異常
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
原因:
JAVA中如果用BigDecimal做除法的時(shí)候一定要在divide方法中傳遞第二個(gè)參數(shù),定義精確到小數(shù)點(diǎn)后幾位,否則在不整除的情況下,結(jié)果是無限循環(huán)小數(shù)時(shí),就會(huì)拋出以上異常。
解決辦法:
a.divide(b,4,RoundingMode.HALF_UP));
第二個(gè)參數(shù)是保留小數(shù)位數(shù)
第三個(gè)代表模式
模式:
ROUND_UP始終對(duì)前一位加1 只入不舍ROUND_DOWN始終不對(duì)小數(shù)進(jìn)行改變 只舍不入ROUND_CEILING如果 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;如果為負(fù),則舍入行為與 ROUND_DOWN 相同。ROUND_FLOOR如果 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;如果為負(fù),則舍入行為與 ROUND_UP 相同。ROUND_HALF_UP四舍五入ROUND_HALF_DOWN五舍六入ROUND_HALF_EVEN如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;如果為偶數(shù),則舍入行為與 ROUND_HALF_DOWN 相同。
心得
BigDecimal 主要用來操作(大)浮點(diǎn)數(shù),BigInteger 主要用來操作大整數(shù)(超過 long 類型)。
BigDecimal 的實(shí)現(xiàn)利用到了 BigInteger, 所不同的是 BigDecimal 加入了小數(shù)位的概念。
java.math.BigDecimal 比較大小
BigDecimal a = new BigDecimal (101);
BigDecimal b = new BigDecimal (111);
//使用compareTo方法比較
//注意:a、b均不能為null,否則會(huì)報(bào)空指針
if(a.compareTo(b) == -1){
System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
System.out.println("a小于等于b");
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java編寫通用的導(dǎo)出任何對(duì)象列表數(shù)據(jù)到excel的工具類
在工作中經(jīng)常會(huì)遇到列表數(shù)據(jù)的導(dǎo)出,每次需要的時(shí)候都要去開發(fā)一次,且數(shù)據(jù)不斷在變化,所以本文將利用Java編寫一個(gè)工具類可以導(dǎo)出任何對(duì)象列表數(shù)據(jù)到excel,希望對(duì)大家有所幫助2024-12-12
Java RabbitMQ 中的消息長(zhǎng)期不消費(fèi)會(huì)過期嗎
RabbitMQ支持消息的過期時(shí)間,在消息發(fā)送時(shí)可以進(jìn)行指定。 RabbitMQ支持隊(duì)列的過期時(shí)間,從消息入隊(duì)列開始計(jì)算,只要超過了隊(duì)列的超時(shí)時(shí)間配置,那么消息會(huì)自動(dòng)的清除2021-09-09
Nacos心跳時(shí)間配置及服務(wù)快速上下線方式
這篇文章主要介紹了Nacos心跳時(shí)間配置及服務(wù)快速上下線方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

