Java BigDecimal除法精度和格式化輸出方式
BigDecimal除法精度和格式化輸出
import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { //保留兩位小數(shù) DecimalFormat df1 = new DecimalFormat("0.00"); DecimalFormat df2 = new DecimalFormat("#.##"); //0.00表示沒數(shù)字位置用0補(bǔ)齊,#。##代表有就有沒有就沒有 System.out.println(df1.format(0.156)); System.out.println(df2.format(0.156)); //高精度實(shí)數(shù)除法 MathContext mc = new MathContext(10, RoundingMode.HALF_DOWN); //必須設(shè)置精度 //ROUND_HALF_UP: 遇到0.5的情況時(shí)往上近似,例: 1.5 -> 2 //ROUND_HALF_DOWN : 遇到0.5的情況時(shí)往下近似,例: 1.5 -> 1 BigDecimal a = BigDecimal.valueOf(5.16545213); BigDecimal b = BigDecimal.valueOf(1.512345); BigDecimal ans = a.divide(b, mc); //高精度整數(shù)不用設(shè)置精度,實(shí)數(shù)必須要 System.out.println(ans); System.out.println(df1.format(ans)); } }
答案
0.16
0.16
3.415524983
3.42
BigDecimal的用法詳解
保留兩位小數(shù),四舍五入,數(shù)字格式化,科學(xué)計(jì)數(shù)法轉(zhuǎn)數(shù)字,數(shù)字里的逗號(hào)處理
Java在java.math包中提供的API類BigDecimal,用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。雙精度浮點(diǎn)型變量double可以處理16位有效數(shù)。
在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理。float和double只能用來做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中要用java.math.BigDecimal。
BigDecimal所創(chuàng)建的是對(duì)象,我們不能使用傳統(tǒng)的+、-、*、/等算術(shù)運(yùn)算符直接對(duì)其對(duì)象進(jìn)行數(shù)學(xué)運(yùn)算,而必須調(diào)用其相對(duì)應(yīng)的方法。方法中的參數(shù)也必須是BigDecimal的對(duì)象。構(gòu)造器是類的特殊方法,專門用來創(chuàng)建對(duì)象,特別是帶有參數(shù)的對(duì)象。
構(gòu)造器描述
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ì)象。
方法描述
add(BigDecimal)
BigDecimal對(duì)象中的值相加,然后返回這個(gè)對(duì)象。subtract(BigDecimal)
BigDecimal對(duì)象中的值相減,然后返回這個(gè)對(duì)象。multiply(BigDecimal)
BigDecimal對(duì)象中的值相乘,然后返回這個(gè)對(duì)象。divide(BigDecimal)
BigDecimal對(duì)象中的值相除,然后返回這個(gè)對(duì)象。toString()
將BigDecimal對(duì)象的數(shù)值轉(zhuǎn)換成字符串。doubleValue()
將BigDecimal對(duì)象中的值以雙精度數(shù)返回。floatValue()
將BigDecimal對(duì)象中的值以單精度數(shù)返回。longValue()
將BigDecimal對(duì)象中的值以長(zhǎng)整數(shù)返回。intValue()
將BigDecimal對(duì)象中的值以整數(shù)返回。
常用方法
保留兩位小數(shù)
/** * 保留兩位小數(shù) */ @org.junit.Test public void formatTest() { double num=13.154215; //方式一 DecimalFormat df1 = new DecimalFormat("0.00"); String str = df1.format(num); System.out.println(str); //13.15 //方式二 // #.00 表示兩位小數(shù) #.0000四位小數(shù) DecimalFormat df2 =new DecimalFormat("#.00"); String str2 =df2.format(num); System.out.println(str2); //13.15 //方式三 //%.2f %. 表示 小數(shù)點(diǎn)前任意位數(shù) 2 表示兩位小數(shù) 格式后的結(jié)果為f 表示浮點(diǎn)型 String result = String.format("%.2f", num); System.out.println(result); //13.15 }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例
這篇文章主要介紹了Java使用synchronized實(shí)現(xiàn)互斥鎖功能,結(jié)合實(shí)例形式分析了Java使用synchronized互斥鎖功能簡(jiǎn)單實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下2020-05-05解決idea中@Data標(biāo)簽getset不起作用的問題
這篇文章主要介紹了解決idea中@Data標(biāo)簽getset不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringCloud實(shí)現(xiàn)基于RabbitMQ消息隊(duì)列的詳細(xì)步驟
在Spring Cloud框架中,我們可以利用RabbitMQ實(shí)現(xiàn)強(qiáng)大而可靠的消息隊(duì)列系統(tǒng),本篇將詳細(xì)介紹如何在Spring Cloud項(xiàng)目中集成RabbitMQ,并創(chuàng)建一個(gè)簡(jiǎn)單的消息隊(duì)列,感興趣的朋友一起看看吧2024-03-03Spring?Cloud?Eureka基礎(chǔ)應(yīng)用及原理
這篇文章主要介紹了Spring?Cloud?Eureka基礎(chǔ)應(yīng)用,Eureka?Client中內(nèi)置一個(gè)負(fù)載均衡器,用來進(jìn)行基本的負(fù)載均衡,下面我們將通過搭建一個(gè)簡(jiǎn)單的Eureka例子來了解Eureka的運(yùn)作原理,感興趣的朋友一起看看吧2022-05-05springboot整合shiro實(shí)現(xiàn)登錄驗(yàn)證授權(quán)的過程解析
這篇文章主要介紹了springboot整合shiro實(shí)現(xiàn)登錄驗(yàn)證授權(quán),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01Java實(shí)現(xiàn)訂單超時(shí)未支付自動(dòng)取消的8種方法總結(jié)
這篇文章主要為大家介紹了Java實(shí)現(xiàn)訂單超時(shí)未支付自動(dòng)取消功能的8種不同方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08@Value如何獲取yml和properties配置參數(shù)
這篇文章主要介紹了@Value如何獲取yml和properties配置參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07