BigDecimal的使用記錄

2021-10-06 04:45:32 字數 2728 閱讀 9808

最近一直忙於工作,好久沒更新部落格了。今天趕在下班之前做乙個簡單的記錄。

在專案中需要計算一筆交易的返現、手續費、分賬串等資訊,大量的使用到bigdecimal,趕在下班之前做乙個簡單的記錄。

在專案中對於金額的操作,我們都是選擇使用bigdecimal (跟金錢打交道,對於精度要求都很高),它支援任何精度的定點數,可以用它來精確計算貨幣值;相反的,float和double只能用來做科學計算或者是工程計算。

4、bigdecimal(int val):將int型別轉換成bigdecimal型別資料

專案中推薦使用第一種方法,第二種牆裂不推薦使用,精度丟失嚴重!!!!!

第一次計算手續費的時候就用的第二種方法,結果程式執行完,莫名其妙少了7毛錢!!! 只到改用第一種方法才確保了金額的正確性,如下:

//交易金額-最終手續費+匯付結算底價-保費金額-角進製金額

bigdecimal amt = new bigdecimal(requestbo.getamount().tostring()).subtract(new bigdecimal(finalfeeamt.tostring())).

add(new bigdecimal(huifustlmlow.tostring())).subtract(new bigdecimal(insuranceamt.tostring())).

subtract(new bigdecimal(jiaoamt.tostring()));

bigdecimal add(bigdecimal value):加法,求兩個bigdecimal型別資料的和

bigdecimal subtract(bigdecimal value):減法,求兩個bigdecimal型別資料的差

bigdecimal multiply(bigdecimal value):乘法,求兩個bigdecimal型別資料的積

bigdecimal divide(bigdecimal divisor):除法,求兩個bigdecimal型別資料的商

bigdecimal remainder(bigdecimal divisor):求餘數,求bigdecimal型別資料除以divisor的餘數

bigdecimal max(bigdecimal value):最大數,求兩個bigdecimal型別資料的最大值

bigdecimal min(bigdecimal value):最小數,求兩個bigdecimal型別資料的最小值

bigdecimal abs():絕對值,求bigdecimal型別資料的絕對值

bigdecimal negate():相反數,求bigdecimal型別資料的相反數

round_up  捨入模式從零開始。 始終在非零丟棄分數之前增加數字。 請注意,該捨入模式不會降低計算值的大小

round_down 捨入模式向零捨入。 不要在丟棄的分數之前遞增數字(即截斷)。 請注意,該捨入模式不會增加計算值的大小

round_ceiling 圓形模式向正無窮大轉彎。 如果bigdecimal為正,則表現為round_up ; 如果為負,則表現為round_down 請注意,捨入模式不會降低計算值。

round_floor 捨入模式向負無窮大轉彎。 如果bigdecimal為正,則表現為round_down ; 如果為負,表現為round_up 請注意,捨入模式不會增加計算值。

round_half_up 四捨五入模式向「最近鄰居」轉彎,除非兩個鄰居都是等距的,在這種情況下是圓括弧的。 對於round_up如果丟棄的分數為0.5,則表現為; 否則,表現為round_down 。 請注意,這是我們大多數人在小學教學的捨入模式

round_half_down 四捨五入模式向「最近鄰居」轉彎,除非這兩個鄰居都是等距離的,在這種情況下,這是倒圓的。 對於round_up如果丟棄的分數》 0.5,則表示行為; 否則,表現為round_down

round_half_even 四捨五入模式向「最近鄰居」轉彎,除非兩個鄰居都是等距離的,在這種情況下,向著鄰居方向轉移。 對於round_half_up行為,如果丟棄的分數的左邊的數字是奇數的; 像round_half_down一樣,如果它是均勻的。 請注意,這是在一系列計算中重複應用時最小化累積誤差的捨入模式。

round_unnecessary 捨入模式來確定所請求的操作具有精確的結果,因此不需要捨入。 如果在產生不精確結果的操作上指定了捨入模式,則丟擲arithmeticexception 。

在專案中常用到的有兩種:

① round_half_up 通俗理解就是我們常說的四捨五入

② round_up 無論末尾是什麼,都向上捨入

比如下圖中的例子:

使用場景:生活中,每一張信用卡在使用之前都必須進行啟用,在啟用的時候,根據不同行的信用卡會有不同的啟用押金。當使用者在使用信用卡之前必須先進行啟用。所謂啟用就是刷一筆金額不小於信用卡本身設定的啟用押金。比如:a信用卡的啟用押金要求是299元,則使用者啟用的時候刷的金額必須大於299元。(不考慮外扣或者內扣)那這種場景就需要比較使用者的消費金額是不是小於啟用押金的299了。

比如下圖的例子:

BigDecimal使用方式

bigdecimal所建立的是物件,故我們不能使用傳統的 等算術運算子直接對其物件進行數 算,而必須呼叫其相對應的方法。方法中的引數也必須是bigdecimal的物件。構造器是類的特殊方法,專門用來建立物件,特別是帶有引數的物件。bigdecimal int 建立乙個具有引數所指定整數值的物件。bi...

bigdecimal使用問題

初始化bigdecimal型別資料的時候,不要用下圖所示的構造初始化,否則很可能會有問題 理由 如果傳入 中的數字為小數型別,則會出現下圖所示的問題。我看了下jdk api 的說明,找到了如下說法。總結一下就是 轉換小數想達到你想要的結果用 new bigdecimal string 或者 bigd...

bigdecimal 的使用方法

bigdecimal.round half 的各種用法 在銀行 帳戶 計費等領域,bigdecimal提供了精確的數值計算。其中8種捨入方式值得掌握。1 round up 捨入遠離零的捨入模式。在丟棄非零部分之前始終增加數字 始終對非零捨棄部分前面的數字加1 注意,此捨入模式始終不會減少計算值的大小...