java計算金額保留兩位小數精確到分(四舍六入五成雙)


四舍六入五成雙:

  四舍六入五成雙是一種比較精確比較科學的計數保留法,是一種數字修約規則。

  對於位數很多的近似數,當有效位數確定后,其后面多余的數字應該舍去,只保留有效數字最末一位,這種修約(舍入)規則是"四舍六入五成雙",也即"4舍6入5湊偶"這里"四"是指≤4 時舍去,"六"是指≥6時進上,"五"指的是根據5后面的數字來定,當5后有數時,舍5入1;當5后無有效數字時,需要分兩種情況來講:①5前為奇數,舍5入1;②5前為偶數,舍5不進。(0是偶數)

  從統計學的角度,"四舍六入五成雙"比"四舍五入"要科學,在大量運算時,它使舍入后的結果誤差的均值趨於零,而不是像四舍五入那樣逢五就入,導致結果偏向大數,使得誤差產生積累進而產生系統誤差,"四舍六入五成雙"使測量結果受到舍入誤差的影響降到最低。

  在實際情況下,大部分交易的手續費是按單筆計算的,每一筆都對應一個手續費。

  例如費率為千分之三,交易1000元,手續費3元,實際到帳997元。交易255元,手續費 255 * 0.003 = 0.765 元。

  但是一般做交易時金額都是精確到分的,采用四舍六入五成雙方法保留小數點后兩位,所以這里手續費是0.76,實際到帳254.24元。

下邊是java工具類:

傳入返回參數類型都是String

public class StringAmountCalUtil {
    /**
     * @Description: 整數相除結果轉換成指定位數的百分數
     * @param dividend : 被除數(分子)
     * @param divisor : 除數(分母)
     * @param digit : 保留幾位小數
     * @return String
     */
    public static String getPercent(int dividend,int divisor,int digit) {
        Float result = (float)dividend/(float)divisor;
        if (result.isNaN()) {
            return "--";
        }else {
            //獲取格式化對象
            NumberFormat nt = NumberFormat.getPercentInstance();
            //設置百分數精確度,即保留幾位小數
            nt.setMinimumFractionDigits(digit);
            String finalResult = nt.format(result);
            return finalResult;
        }
    }

    /**
     * 兩個數相加
     * @param str1
     * @param str2
     * @return
     */
    public static String add(String str1,String str2) {
        try {
            return new BigDecimal(str1).add(new BigDecimal(str2)).toPlainString();
        }catch (Exception e){
            return null;
        }
    }

    /**
     * 兩個數相乘
     * @param str1
     * @param str2
     * @return
     */
    public static String multiply(String str1,String str2) {
        try {
            return new BigDecimal(str1).multiply(new BigDecimal(str2)).toPlainString();
        }catch (Exception e){
            return null;
        }
    }
    
    /**
     * 兩個數相減
     * @param str1
     * @param str2
     * @return
     */
    public static String subtract(String str1,String str2) {
        try {
            return new BigDecimal(str1).subtract(new BigDecimal(str2)).toPlainString();
        }catch (Exception e){
            return null;
        }
    }
    
    /**
     * 兩個數相除
     * @param str1
     * @param str2
     * @return
     */
    public static String divide(String str1,String str2) {
        try {
            return new BigDecimal(str1).divide(new BigDecimal(str2),5).toPlainString();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 四舍六入五五成雙
     * @param str
     */
    public static String FourUpSixInto(String str){
        BigDecimal b1 = new BigDecimal(str);
        BigDecimal b2 = b1.setScale(2, BigDecimal.ROUND_HALF_EVEN);
        return b2.toString();
    }
}

public static void main(String [] args) {
  String jine = "255.00";
  String feilv = "0.003";
  String shouxufei = StringUtil.FourUpSixInto(StringUtil.multiply(jine, feilv));
  String realMoney = StringUtil.subtract(jine, shouxufei);
  System.out.println("交易金額["+jine+"]\n費率["+feilv+"]\n手續費["+shouxufei+"]\n到帳金額["+realMoney+"]\n");
}

運行結果:

交易金額[255.00]
費率[0.003]
手續費[0.76]
到帳金額[254.24]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM