最近一直忙於工作,好久沒更新部落格了。今天趕在下班之前做乙個簡單的記錄。
在專案中需要計算一筆交易的返現、手續費、分賬串等資訊,大量的使用到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 注意,此捨入模式始終不會減少計算值的大小...