解決Java中new?BigDecimal()的坑
new BigDecimal()的坑
先看一段代碼示例:
System.out.println(new BigDecimal(0.99));
System.out.println(new BigDecimal("0.99"));
System.out.println(BigDecimal.valueOf(0.99));
System.out.println(new BigDecimal(Double.valueOf(0.99)));
System.out.println(new BigDecimal(Double.valueOf(0.99).toString()));輸出結(jié)果如下:
0.9899999999999999911182158029987476766109466552734375
0.99
0.99
0.9899999999999999911182158029987476766109466552734375
0.99
可以看到new BigDecimal(double)類型時,小數(shù)的精度出現(xiàn)擴(kuò)展。
總結(jié):如果使用new BigDecimal()時,盡可能轉(zhuǎn)換為String,或者直接使用BigDecimal.valueof(double)
關(guān)于BigDecimal用法
如果對數(shù)值結(jié)果精度要求很高,那么就可以使用BigDecimal,BigDecimal可以精準(zhǔn)的控制小數(shù)點(diǎn)后面的數(shù)字
1.實(shí)例 BigDecimal 對象
通常會使用 String 和 int 構(gòu)造方法實(shí)例出 BigDecimal 對象,即
new BigDecimal(String val); new BigDecimal(int val);
如參數(shù)為 double 類型,得先轉(zhuǎn)換成 String 類型再入?yún)?/p>
new BigDecimal(Double.toString(123.123));
2. BigDecimal 加減乘除
加減乘除都是用 BigDecimal 對象點(diǎn)(.)加減乘除方法入?yún)?BigDecimal 對象,返回的也是 BigDecimal 對象
- 加:BigDecimal add = new BigDecimal("123.123").add(new BigDecimal("123.123")); ---> 246.246
- 減:BigDecimal subtract = new BigDecimal("123.123").subtract(new BigDecimal("123.123")); ---> 0.000
- 乘:BigDecimal multiply = new BigDecimal("123.123").multiply(new BigDecimal("123.123")); ---> 15159.273129
- 除:BigDecimal divide = new BigDecimal("123.123").divide(new BigDecimal("123.123")); ---> 1
注:其中除法一般不會這樣直接除,在不能整除的情況下,這樣運(yùn)行程序是會報(bào)錯的,所以一般除法會使用下面這個重載方法
new BigDecimal("10").divide("40",1,ROUND_HALF_UP); ?---> 0.3正常計(jì)算 10/40 結(jié)果為 0.25, 在這里是計(jì)算 十除以四十,保留一位小數(shù),四舍五入模式。所以得到的結(jié)果為 0.3
最常用的模式:
- ① ROUND_HALF_UP:四舍五入
- ② ROUND_HALF_DOWN:向下取舍(去掉保留小數(shù)位后面的小數(shù))
3. Scale 屬性操作
- ① 獲取小數(shù)的位數(shù):new BigDecimal("123.123").scale() ---> 3
- ② setScale() 方法保留幾位小數(shù)
- setScale(int NewScale):(注:入?yún)⒌臄?shù)字只能大于等于小數(shù)的位數(shù),括號中只能入?yún)⒋笥诘扔?3 的數(shù))
例:
new BigDecimal("123.123").setScale(3) ?---> 123.123
new BigDecimal("123.123").setScale(5) ?---> 123.12300
- setScale(int newScale, RoundingMode roundingMode):例:
new BigDecimal("123.123").setScale(2,RoundingMode.HALF_UP) ?---> 123.12
new BigDecimal("123.125").setScale(2,RoundingMode.HALF_UP) ?---> 123.13
new BigDecimal("123.123").setScale(2,RoundingMode.HALF_DOWN) ?---> 123.12
new BigDecimal("123.125").setScale(2,RoundingMode.HALF_DOWN) ?---> 123.124. compareTo 比較大小
等于:
new BigDecimal("123.123").compareTo(new BigDecimal("123.123"))==0 ?---> true
new BigDecimal("123.123").compareTo(new BigDecimal("123.123")) ?---> 0如果 compareTo 的結(jié)果為 0 的話,就證明兩個對象相等(當(dāng)左邊不等于右邊時,第一個表達(dá)式則為 false)
小于:
new BigDecimal("123.122").compareTo(new BigDecimal("123.123")) < 0 ?---> true
new BigDecimal("123.122").compareTo(new BigDecimal("123.123")) ?---> -1如果 compareTo 的結(jié)果為 -1 的話,就證明左邊小于右邊(當(dāng)左邊大于等于右邊時,第一個表達(dá)式則為 false)
大于:
new BigDecimal("123.124").compareTo(new BigDecimal("123.123")) > 0 ?---> true
new BigDecimal("123.124").compareTo(new BigDecimal("123.123")) ?---> 1如果 compareTo 的結(jié)果為 1 的話,就證明左邊大于右邊(當(dāng)左邊小于等于右邊時,第一個表達(dá)式則為 false)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot集群管理工具KafkaAdminClient使用方法解析
這篇文章主要介紹了Spring Boot集群管理工具KafkaAdminClient使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
淺談springmvc 通過異常增強(qiáng)返回給客戶端統(tǒng)一格式
這篇文章主要介紹了淺談springmvc 通過異常增強(qiáng)返回給客戶端統(tǒng)一格式。具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java?ConcurrentHashMap實(shí)現(xiàn)線程安全的代碼示例
眾所周知ConcurrentHashMap是HashMap的多線程版本,HashMap?在并發(fā)操作時會有各種問題,而這些問題,只要使用ConcurrentHashMap就可以完美解決了,本文將給詳細(xì)介紹ConcurrentHashMap是如何保證線程安全的2023-05-05
Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法
Swagger?是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?RESTful?風(fēng)格的?Web?服務(wù),這篇文章主要介紹了Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法,需要的朋友可以參考下2022-11-11
Java實(shí)現(xiàn)擲骰子控制臺和窗體兩種方法
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)擲骰子控制臺和窗體兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
使用java實(shí)現(xiàn)云端資源共享小程序的代碼
這篇文章主要介紹了用java寫一個云端資源共享小程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
java中靜態(tài)變量和實(shí)例變量的區(qū)別詳細(xì)介紹
本篇文章介紹了,java中靜態(tài)變量和實(shí)例變量的區(qū)別。需要的朋友參考下2013-05-05
Java對文本文件MD5加密并ftp傳送到遠(yuǎn)程主機(jī)目錄的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java對文本文件MD5加密并ftp傳送到遠(yuǎn)程主機(jī)目錄的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08

