String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑記錄
String轉(zhuǎn)BigDecimal,BigDecimal常用操作,以及避免踩坑
String轉(zhuǎn)BigDecimal
String a = "50.00"; //字符串類型,必須是數(shù)字,否則會(huì)報(bào)錯(cuò), java.lang.NumberFormatException 異常 BigDecimal b =new BigDecimal(a);
BigDecimal加法運(yùn)算
BigDecimal planeTax=new BigDecimal(bookInfo.getPlaneTax()); BigDecimal yq=new BigDecimal(bookInfo.getYq()); BigDecimal publishPrice = new BigDecimal(cabinInfo.getPublishPrice()); totalPrice =publishPrice.add(planeTax).add(yq);
BigDecimal減法運(yùn)算
BigDecimal planeTax=new BigDecimal(bookInfo.getPlaneTax()); BigDecimal yq=new BigDecimal(bookInfo.getYq()); BigDecimal publishPrice = new BigDecimal(cabinInfo.getPublishPrice()); totalPrice =publishPrice.subtract(planeTax).subtract(yq);
BigDecimal乘法運(yùn)算
BigDecimal planeTax=new BigDecimal(bookInfo.getPlaneTax()); BigDecimal yq=new BigDecimal(bookInfo.getYq()); BigDecimal publishPrice = new BigDecimal(cabinInfo.getPublishPrice()); totalPrice =publishPrice.multiply(planeTax).multiply(yq);
BigDecimal避免踩坑
BigDecimal planeTax=new BigDecimal(bookInfo.getPlaneTax());//string數(shù)據(jù)轉(zhuǎn)換BigDecimal BigDecimal yq=new BigDecimal(bookInfo.getYq());//string數(shù)據(jù)轉(zhuǎn)換BigDecimal BigDecimal publishPrice = new BigDecimal(cabinInfo.getPublishPrice());//string數(shù)據(jù)轉(zhuǎn)換BigDecimal //進(jìn)行相加再相乘操作時(shí)注意不要直接用符號(hào)+、-、*等,后面是四舍五入的格式 totalPrice =(publishPrice.add(planeTax).add(yq)).multiply( new BigDecimal(model.getBookInfoList().size())) .setScale(2, BigDecimal.ROUND_HALF_UP); totalPrice = price.subtract(couponMoney);
String如何轉(zhuǎn)成BigDecimal_Java.math.BigDecimal類的使用
浮點(diǎn)數(shù)值不適用于無法接受舍入誤差的金融計(jì)算中。
例如,命令System.out.prmtln (2.0-1.1)將打印出0.8999999999999999,而不是人們想象的0.9 。
2.0-1.1的運(yùn)算結(jié)果
這種舍入誤差的主要原因是浮點(diǎn)數(shù)值采用二進(jìn)制系統(tǒng)表示,而在二進(jìn)制系統(tǒng)中 無法精確地表示分?jǐn)?shù)1/10。這就好像十進(jìn)制無法精確地表示分?jǐn)?shù)1/3一樣。如果在數(shù)值 計(jì)算中不允許有任何舍入誤差,就應(yīng)該使用BigDecimaI類
BigDecimal構(gòu)造方法
- BigDecimal(double val) 將double表示形式轉(zhuǎn)換為BigDecimal *不建議使用
- BigDecimal(int val) 將int表示形式轉(zhuǎn)換成BigDecimal
- BigDecimal(String val) 將String表示形式轉(zhuǎn)換成BigDecimal
JDK1.8 API幫助文檔
為什么不建議采用第一種構(gòu)造方法呢?來看例子
為什么bDouble不等于2.3?
為什么會(huì)出現(xiàn)這種情況呢?
JDK的描述:
1、參數(shù)類型為double的構(gòu)造方法的結(jié)果有一定的不可預(yù)知性。這是因?yàn)?.1無法準(zhǔn)確地表示為 double,實(shí)際上等于0.1000000000000000055511151231257827021181583404541015625。
2、另一方面,String 構(gòu)造方法是完全可預(yù)知的:寫入 newBigDecimal(“0.1”) 將創(chuàng)建一個(gè) BigDecimal,它正好等于預(yù)期的 0.1。因此,比較而言,通常建議優(yōu)先使用String構(gòu)造方法。
BigDecimal的靜態(tài)方法valueOf
當(dāng)double必須用作BigDecimal的源時(shí),可以使用BigDecimal的靜態(tài)方法valueOf
如果使用Double.toString(double)轉(zhuǎn)成String,然后再使用BigDecimal構(gòu)造方法,*這樣會(huì)很復(fù)雜,如下
BigDecimal加減乘除運(yùn)算
對(duì)于常用的加,減,乘,除,BigDecimal類提供了相應(yīng)的成員方法
API文檔給出的BigDecimal類相應(yīng)的成員方法
大致的用法如下
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java使用AOP技術(shù)實(shí)現(xiàn)通用接口驗(yàn)簽工具
這篇文章主要為大家詳細(xì)介紹了Java如何使用AOP技術(shù)實(shí)現(xiàn)通用接口驗(yàn)簽工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下吧2025-03-03SpringBoot使用Sa-Token實(shí)現(xiàn)路徑攔截和特定接口放行
這篇文章主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)路徑攔截和特定接口放行,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)
這篇文章主要介紹了HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06詳解Spring Data JPA使用@Query注解(Using @Query)
本篇文章主要介紹了詳解Spring Data JPA使用@Query注解(Using @Query),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07java實(shí)現(xiàn)學(xué)生選課系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生選課系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置
這篇文章主要介紹了Intellij IDEA中一次性折疊所有Java代碼的快捷鍵設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Spring Security如何使用URL地址進(jìn)行權(quán)限控制
這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12