四舍六入五成雙:
四舍六入五成雙是一種比較精確比較科學的計數保留法,是一種數字修約規則。
對於位數很多的近似數,當有效位數確定后,其后面多余的數字應該舍去,只保留有效數字最末一位,這種修約(舍入)規則是"四舍六入五成雙",也即"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]