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

四捨六入五成雙:html

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

  對於位數不少的近似數,當有效位數肯定後,其後面多餘的數字應該捨去,只保留有效數字最末一位,這種修約(舍入)規則是"四捨六入五成雙",也即"4舍6入5湊偶"這裏"四"是指≤4 時捨去,"六"是指≥6時進上,"五"指的是根據5後面的數字來定,當5後有數時,舍5入1;當5後無有效數字時,須要分兩種狀況來說:①5前爲奇數,舍5入1;②5前爲偶數,舍5不進。(0是偶數)git

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

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

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

  可是通常作交易時金額都是精確到分的,採用四捨六入五成雙方法保留小數點後兩位,因此這裏手續費是0.76,實際到賬254.24元。code

下邊是java工具類:orm

傳入返回參數類型都是Stringhtm

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]

相關文章
相關標籤/搜索