摘要:文章鏈接精度計算精度計算目前接觸的業(yè)務(wù)中,對數(shù)據(jù)的精度要求比較高,因此不再使用基本的,改為用進行存儲和相關(guān)的計算,端午前的這一篇博文,則簡單的介紹下的使用姿勢,早點回家早點放假基本使用構(gòu)造方法幾個常見的構(gòu)造方式,將基本類型等,轉(zhuǎn)
文章鏈接:https://liuyueyi.github.io/hexblog/2018/06/15/180615-精度計算BigDecimal/
180615-精度計算BigDecimal目前接觸的業(yè)務(wù)中,對數(shù)據(jù)的精度要求比較高,因此不再使用基本的float,double,改為用BigDecimal進行存儲和相關(guān)的計算,端午前的這一篇博文,則簡單的介紹下BigDecimal的使用姿勢,早點回家早點放假
I. 基本使用 1. 構(gòu)造方法幾個常見的構(gòu)造方式,將基本類型+String等,轉(zhuǎn)換為BigDecimal對象
public BigDecimal(char[] in); public BigDecimal(String val); public BigDecimal(BigInteger val); public BigDecimal(int val); public BigDecimal(long val); public BigDecimal(double val)2. 加減乘除
public BigDecimal add(BigDecimal value); //加法 public BigDecimal subtract(BigDecimal value); //減法 public BigDecimal multiply(BigDecimal value); //乘法 public BigDecimal divide(BigDecimal value); //除法
從上面的簽名上,可以看出操作是屬于鏈式結(jié)構(gòu)(Builder模式),然后一個問題就是執(zhí)行上面的操作之后,被調(diào)用的對象,是否會發(fā)生修改? (即下面的測試中的o值是否改變)
@Test public void testBigDecimal() { BigDecimal o = new BigDecimal(11.1); BigDecimal d = new BigDecimal(1); System.out.println(o.add(d) + "| " + o); }
輸出結(jié)果
12.0999999999999996447286321199499070644378662109375| 11.0999999999999996447286321199499070644378662109375
結(jié)論: 計算后的結(jié)果需要保存,因為不會修改目標對象的值
3. 精度前面的例子中,輸出后面一長串,而這往往并不是我們希望的,所以可以設(shè)置下精度
public BigDecimal setScale(int newScale, RoundingMode roundingMode);
一個簡單的case如下
@Test public void testBigDecimal() { BigDecimal o = new BigDecimal(11.1); System.out.println(o.setScale(3, RoundingMode.CEILING) + "| " + o); }
輸出
11.100| 11.0999999999999996447286321199499070644378662109375
從上面的輸出,特別是第二列,如果我們選擇的精度方式是取下限,會不會有問題呢?
@Test public void testBigDecimal() { BigDecimal o = new BigDecimal(11.1); System.out.println(o.setScale(1, RoundingMode.FLOOR) + "| " + o); }
輸出結(jié)果為:
11.0| 11.0999999999999996447286321199499070644378662109375
所以需要注意的地方就來了,對浮點數(shù)進行精度設(shè)置時,需要根據(jù)自己的業(yè)務(wù)場景,選擇合適的取整方式,不然很容易出問題
取精度的幾個參數(shù)說明
ROUND_CEILING //向正無窮方向舍入 ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向負無窮方向舍入 ROUND_HALF_DOWN //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向下舍入, 例如1.55 保留一位小數(shù)結(jié)果為1.5 ROUND_HALF_EVEN //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,如果保留位數(shù)是奇數(shù),使用ROUND_HALF_UP,如果是偶數(shù),使用ROUND_HALF_DOWN ROUND_HALF_UP //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,如果是這樣,向上舍入, 1.55保留一位小數(shù)結(jié)果為1.6 ROUND_UNNECESSARY //計算結(jié)果是精確的,不需要舍入模式 ROUND_UP //向遠離0的方向舍入II. 其他 1. 一灰灰Blog: https://liuyueyi.github.io/he...
一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關(guān)注文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71212.html
摘要:然而表示這個是的鍋,我不背。的表示一共的數(shù)字位能存儲個,表示存儲兩位小數(shù)。因為默認是保留兩位小數(shù),超過了精度,所以保存近似值。大范圍低精度存儲。很準確,采用科學計數(shù)法,損失精度,但能存儲更大范圍的數(shù)據(jù),但是精度有損失。 BigDecimal 為什么要使用這個呢?簡單點說就是商業(yè)要求精度計算,而double計算出來的結(jié)果,往往出人意料。 例子 Double運算 showImg(https...
摘要:使用,保證精度的同時,能精準的進行四舍六入計算。類精確的數(shù)學運算使用來實現(xiàn)精準度因為精度的原因構(gòu)造方法的結(jié)果有一定的不可預知性,例如因此建議使用。算法規(guī)則四舍六入五考慮,五后非零就進一,五后皆零看奇偶,五前為偶應舍去,五前為奇要進一。 四舍六入計算 算法規(guī)則: 四舍六入五考慮, 五后非零就進一, 五后皆零看奇偶, 五前為偶應舍去, 五前為奇要進一。 使用BigDecimal,保證精度的...
摘要:除法的精度問題在使用的除法時,遇到一個鬼畜的問題,本以為的精度計算,結(jié)果使用返回,當然最終發(fā)現(xiàn)還是自己的使用姿勢不對導致的,因此記錄一下,避免后面重蹈覆轍問題拋出在使用做高精度的除法時,一不注意遇到了一個小問題,如下上面的輸出是什么 showImg(https://segmentfault.com/img/remote/1460000015555232); BigDecimal除法的精...
摘要:錯誤將導致不能漲薪。如果未指定舍入模式,并且無法表示準確結(jié)果,則拋出一個異常否則,通過向該操作提供適當?shù)膶ο螅梢詫σ堰x擇的精度和舍入模式執(zhí)行計算。使用此類例如,中的整數(shù)字段來表示舍入模式已過時應改為使用例如,的枚舉值。 為什么金額要使用BigDecimal而不使用Double? 在電商或者金融行業(yè),看似很小的誤差但是通過一番計算后會導致很大的誤差,誤差將演變?yōu)殄e誤。錯誤將導致不能漲薪...
摘要:在中處理帶小數(shù)的數(shù)據(jù)時,通常會碰到需要進行對數(shù)據(jù)進行四舍五入或者截取等操作。提供了一個的方法,很方便的幫助我們實現(xiàn)想要的操作。 在Java中處理帶小數(shù)的數(shù)據(jù)時,通常會碰到需要進行對數(shù)據(jù)進行四舍五入或者截取等操作。BigDecimal提供了一個setScale()的方法,很方便的幫助我們實現(xiàn)想要的操作。 通常用到的是下面的方法 setScale(int newScale, in...
閱讀 3603·2021-11-24 10:25
閱讀 2508·2021-11-24 09:38
閱讀 1217·2021-09-08 10:41
閱讀 2903·2021-09-01 10:42
閱讀 2569·2021-07-25 21:37
閱讀 1981·2019-08-30 15:56
閱讀 914·2019-08-30 15:55
閱讀 2749·2019-08-30 15:54