網(wǎng)站首頁 編程語言 正文
文章目錄
- 前言
- 一、BigDecimal類
- 二、常用方法
- 1.構(gòu)造方法
- 2.基本的運算
- 加法
- 減法
- 乘法
- 除法
- 3.保留小數(shù)(精確到幾位)
- 4.舍入的類型
- ROUND_UP向上舍入
- ROUND_DOWN向下舍入
- ROUND_CEILING正向舍入
- ROUND_FLOOR負向舍入
- ROUND_HALF_UP四舍五入
- ROUND_HALF_DOWN五舍六入
- 總結(jié)
前言
最近項目中有個需求,需要將庫中某個字段的值累加,并精確到小數(shù)點后兩位,返回前端顯示,開始使用的是Double去實現(xiàn),沒想到出了問題,Double數(shù)據(jù)類型在進行累加操作的時候會丟失精度,所以數(shù)據(jù)顯示的時候,輸出的是一個小數(shù)點后很長的數(shù)據(jù),因此果斷改為BigDeciml操作,剛好記錄一下BigDemical的一些常用操作。
一、BigDecimal類
根據(jù)Java8中文手冊,Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。雙精度浮點型變量double可以處理16位有效數(shù)。在實際應(yīng)用中,需要對更大或者更小的數(shù)進行運算和處理。float和double只能用來做科學(xué)計算或者是工程計算,在商業(yè)計算中要用java.math.BigDecimal。BigDecimal所創(chuàng)建的是對象,我們不能使用傳統(tǒng)的+、-、*、/等算術(shù)運算符直接對其對象進行數(shù)學(xué)運算,而必須調(diào)用其相對應(yīng)的方法。方法中的參數(shù)也必須是BigDecimal的對象。構(gòu)造器是類的特殊方法,專門用來創(chuàng)建對象,特別是帶有參數(shù)的對象。
二、常用方法
1.構(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ù)值的對象
構(gòu)造方法一共有四種,其中使用double聲明一個BigDecimal類時,盡量不要直接傳入Double的值,因為這樣構(gòu)造的BigDemical是不可預(yù)知的,建議使用String.valueOf(number)傳入
2.基本的運算
加法
使用add方法如下:
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.add(new BigDecimal(456)))
如果被加的數(shù)是一個Double類型的數(shù)據(jù)建議使用以下寫法:
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.add(new BigDecimal(String.valueOf(0.45))))
先將數(shù)據(jù)轉(zhuǎn)化為字符串,然后將使用構(gòu)造方法
如果執(zhí)行加法以后還要對結(jié)果進行舍入,那么可以做以下處理:
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.add(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
減法
使用subtract方法
BigDecimal num1 = new BigDecimal(456);
log.info("結(jié)果為:{}",num1.subtract(new BigDecimal(123)))
Double類型同上
同樣也可以進行舍入
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.subtract(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
乘法
使用multiply方法
BigDecimal num1 = new BigDecimal(456);
log.info("結(jié)果為:{}",num1.multiply(new BigDecimal(123)))
Double類型同加法
同樣也可以進行舍入
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.multiply(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
除法
使用divide方法
BigDecimal num1 = new BigDecimal(456);
log.info("結(jié)果為:{}",num1.divide(new BigDecimal(123)))
同樣也可以進行舍入
BigDecimal num1 = new BigDecimal(123);
log.info("結(jié)果為:{}",num1.divide(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
3.保留小數(shù)(精確到幾位)
可以使用divide方法對一個BigDecimal類型的數(shù)據(jù)進行保留幾位小數(shù)的處理
例如:
BigDecimal divisor = new BigDecimal(1000);
BigDecimal num = new BigDecimal(4561.2564);
num.divide(divisor, 2, BigDecimal.ROUND_CEILING)
log.info("原來的數(shù)除以1000保留兩位小數(shù):{}",num1.divide(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
或者只保留兩位小數(shù)
BigDecimal num = new BigDecimal(4561.2564);
num.setScale(2, BigDecimal.ROUND_CEILING)
log.info("原來的數(shù)除以1000保留兩位小數(shù):{}",num1.divide(new BigDecimal(String.valueOf(0.45),BigDecimal.ROUND_CEILING)))
4.舍入的類型
這里只記錄可能會用到的幾種類型
ROUND_UP向上舍入
無論正負,只要大于都會進一
BigDecimal num = new BigDecimal(String.valueOf(1.4));
System.out.println(num.setScale(0, BigDecimal.ROUND_UP));
//2
BigDecimal num1 = new BigDecimal(String.valueOf(-1.4));
System.out.println(num1.setScale(0, BigDecimal.ROUND_UP));
//-2
ROUND_DOWN向下舍入
無論正負,都會舍去
BigDecimal num = new BigDecimal(String.valueOf(1.4));
System.out.println(num.setScale(0, BigDecimal.ROUND_DOWN));
//1
BigDecimal num1 = new BigDecimal(String.valueOf(-1.4));
System.out.println(num1.setScale(0, BigDecimal.ROUND_DOWN));
//-1
ROUND_CEILING正向舍入
是 ROUND_UP 和ROUND_DOWN 的組合,如果 BigDecimal 為正數(shù),則行為與 ROUND_UP 相同;如果 BigDecimal 為負數(shù),則行為與 ROUND_DOWN 相同
BigDecimal num = new BigDecimal(String.valueOf(1.4));
System.out.println(num.setScale(0, BigDecimal.ROUND_CEILING));
//2
BigDecimal num1 = new BigDecimal(String.valueOf(-1.4));
System.out.println(num1.setScale(0, BigDecimal.ROUND_CEILING));
//-1
ROUND_FLOOR負向舍入
ROUND_UP 和 ROUND_DOWN 的組合,但是和ROUND_CEILING 是相反的。如果 BigDecimal 為正數(shù),則行為與 ROUND_DOWN 相同;如果為負數(shù),則行為與 ROUND_UP 相同
BigDecimal num = new BigDecimal(String.valueOf(1.4));
System.out.println(num.setScale(0, BigDecimal.ROUND_FLOOR));
//1
BigDecimal num1 = new BigDecimal(String.valueOf(-1.4));
System.out.println(num1.setScale(0, BigDecimal.ROUND_FLOOR));
//-2
ROUND_HALF_UP四舍五入
這個就是我們經(jīng)常使用的,不再解釋
BigDecimal num = new BigDecimal(String.valueOf(1.4));
System.out.println(num.setScale(0, BigDecimal.ROUND_HALF_UP));
//1
BigDecimal num1 = new BigDecimal(String.valueOf(-1.4));
System.out.println(num1.setScale(0, BigDecimal.ROUND_HALF_UP));
//-1
BigDecimal num2 = new BigDecimal(String.valueOf(1.5));
System.out.println(num2.setScale(0, BigDecimal.ROUND_HALF_UP));
//2
BigDecimal num3 = new BigDecimal(String.valueOf(-1.5));
System.out.println(num3.setScale(0, BigDecimal.ROUND_HALF_UP));
//-2
ROUND_HALF_DOWN五舍六入
大于6就進一,小于6就舍去
BigDecimal num = new BigDecimal(String.valueOf(1.6));
System.out.println(num.setScale(0, BigDecimal.ROUND_HALF_DOWN));
//2
BigDecimal num1 = new BigDecimal(String.valueOf(-1.6));
System.out.println(num1.setScale(0, BigDecimal.ROUND_HALF_DOWN));
//-2
BigDecimal num2 = new BigDecimal(String.valueOf(1.5));
System.out.println(num2.setScale(0, BigDecimal.ROUND_HALF_DOWN));
//1
BigDecimal num3 = new BigDecimal(String.valueOf(-1.5));
System.out.println(num3.setScale(0, BigDecimal.ROUND_HALF_DOWN));
//-1
總結(jié)
BigDecimal在業(yè)務(wù)需求比較精準的情況下,是非常必要的,可以避免基本數(shù)據(jù)類型產(chǎn)生的bug
原文鏈接:https://blog.csdn.net/l_zl2021/article/details/131226434
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-08-11 C++超詳細講解強制類型轉(zhuǎn)換的用法_C 語言
- 2022-05-17 qt 錯誤GL/gl.h: No such file or directory的解決方法
- 2022-12-21 詳解Golang中Channel的原理和使用技巧_Golang
- 2022-05-22 Docker容器之間數(shù)據(jù)傳輸?shù)膶崿F(xiàn)_docker
- 2022-10-16 python?os模塊使用方法介紹_python
- 2022-11-02 python函數(shù)和python匿名函數(shù)lambda詳解_python
- 2023-01-10 C#固定大小緩沖區(qū)及使用指針復(fù)制數(shù)據(jù)詳解_C#教程
- 2022-04-28 Python可視化學(xué)習(xí)之seaborn繪制線型回歸曲線_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支