BigDecimal的个人总结
前言:
互聯(lián)網(wǎng)公司,對于BigDecimal的使用,還是較為頻繁的,那么就會涉及到關(guān)于這個類型的種種問題.
1:為什么使用BigDecimal
首先java八大基本類型真的很基本,4個整型搞不了小數(shù),double和float搞的了小數(shù),但搞不好,關(guān)鍵時刻就調(diào)鏈子,當(dāng)然這也和他們存儲方式有關(guān)(二進(jìn)制無法精確的表示1/10),天生注定搞不了精密計算,尤其是和錢相關(guān)的.
所以一般我們對于精密點(diǎn)的計算和涉及貨幣的計算,都會使用BigDecimal.他的出現(xiàn),就是為了解決基本數(shù)據(jù)類型浮點(diǎn)數(shù)不能進(jìn)行精確計算的問題.
2:如何使用BigDecimal
就說最常用的:
2.1.初始化,一般使用這個構(gòu)造方法:new BigDecimal(String value);
其他的不再多說,某度很多,只能說我們一般都會用這個String類型的入?yún)?/p>
關(guān)于BigDecimal的初始化,有一個坑要注意,就是盡量使用String類型的去初始化。
不信的話,可以看看下面的例子:BigDecimal a = new BigDecimal(1.01);BigDecimal b = new BigDecimal(1.02);BigDecimal c = new BigDecimal("1.01");BigDecimal d = new BigDecimal("1.02");System.out.println(a.add(b));System.out.println(c.add(d));
最終的打印結(jié)果是:
2.0300000000000000266453525910037569701671600341796875
2.03
很明顯,也是精度問題。這塊要注意。
2.2.基本運(yùn)算
add(BigDecimal) BigDecimal對象中的值相加,然后返回這個對象。 subtract(BigDecimal) BigDecimal對象中的值相減,然后返回這個對象。 multiply(BigDecimal) BigDecimal對象中的值相乘,然后返回這個對象。 divide(BigDecimal) BigDecimal對象中的值相除,然后返回這個對象。 toString() 將BigDecimal對象中的值以字符串形式返回。 doubleValue() 將BigDecimal對象中的值以雙精度數(shù)返回。 floatValue() 將BigDecimal對象中的值以單精度數(shù)返回。 longValue() 將BigDecimal對象中的值以長整數(shù)返回。 intValue() 將BigDecimal對象中的值以整數(shù)返回。3.采坑經(jīng)驗(敲黑板的重點(diǎn)!!!)
3.1.將BigDecimal類性的值(10.1000)傳給頁面后,頁面展示的(10.1000)不是我們想要的(10.1),該怎么處理?
3.2.值的比較用compareTo,不要用equals
compareTo:左邊比右邊數(shù)大,返回1,相等返回0,比右邊小返回-1
equals:BigDecimal重寫了equals,比較的是數(shù)值
3.3.除法要養(yǎng)成習(xí)慣去設(shè)置精度,以免出現(xiàn)無限循環(huán)的小數(shù)而拋異常
(java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result)
3.4.既然用了BigDecimal了,就應(yīng)避免再與浮點(diǎn)類型互相轉(zhuǎn)換,否則精度會受很大的影響
4.BigDecimal格式化
可以使用NumberFormat類的format(BigDecimal)方法,利用NumberFormat不同類型的實(shí)例,對BigDecimal轉(zhuǎn)換不同的格式.詳細(xì)可以查查NumberFormat的各種實(shí)例方法,比如:
NumberFormat.getCurrencyInstance();
NumberFormat.getCurrencyInstance();
NumberFormat.getInstance();
…
根據(jù)不同的需求,使用不同的格式…
下面提供兩個現(xiàn)成的轉(zhuǎn)換精度的方法
5.BigDecimal取整
public static void main(String[] args) {BigDecimal bigDecimal = new BigDecimal(6.66);//6.66除以6,向上取整,結(jié)果為2BigDecimal divide = bigDecimal.divide(BigDecimal.valueOf(6),0, BigDecimal.ROUND_UP);System.out.println(divide);//2//6.66除以6,不報錯,但有這么多小數(shù)跟在后面BigDecimal divide2 = bigDecimal.divide(BigDecimal.valueOf(6), BigDecimal.ROUND_UP);System.out.println(divide2);//1.110000000000000023684757858670006195704142252605//1.110000000000000023684757858670006195704142252605向上取整,結(jié)果為2BigDecimal bigDecimal1 = divide2.setScale(0, BigDecimal.ROUND_UP);System.out.println(bigDecimal1);//6.66除以6,報錯:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.BigDecimal divide1 = bigDecimal.divide(BigDecimal.valueOf(6));System.out.println(divide1);//報錯}各個roundingMode詳解如下:
ROUND_UP:非0時,舍棄小數(shù)后(整數(shù)部分)加1,比如1.11結(jié)果為2,-1.11結(jié)果為 -2
ROUND_DOWN:直接舍棄小數(shù)
ROUND_CEILING:如果 BigDecimal 是正的,則做 ROUND_UP 操作;如果為負(fù),則做 ROUND_DOWN 操作 (一句話:取附近較大的整數(shù))
ROUND_FLOOR: 如果 BigDecimal 是正的,則做 ROUND_DOWN 操作;如果為負(fù),則做 ROUND_UP 操作(一句話:取附近較小的整數(shù))
ROUND_HALF_UP:四舍五入(取更近的整數(shù))
ROUND_HALF_DOWN:跟ROUND_HALF_UP 差別僅在于0.5時會向下取整
ROUND_HALF_EVEN:取最近的偶數(shù)
ROUND_UNNECESSARY:不需要取整,如果存在小數(shù)位,就拋ArithmeticException 異常
總結(jié)
以上是生活随笔為你收集整理的BigDecimal的个人总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 碧雪情天服务器地址源如何修改,稀有游戏《
- 下一篇: [设计模式] ------ 策略模式