四捨六入五成雙: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]