java计算保留两位⼩数_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 classStringAmountCalUtil {/*** @Description: 整数相除结果转换成指定位数的百分数
*@paramdividend : 被除数(分⼦)
*@paramdivisor : 除数(分母)
*@paramdigit : 保留⼏位⼩数
*@returnString*/
public static String getPercent(int dividend,int divisor,intdigit) {
Float result= (float)dividend/(float)divisor;if(result.isNaN()) {return "--";
}else{//获取格式化对象
NumberFormat nt =PercentInstance();//设置百分数精确度,即保留⼏位⼩数
nt.setMinimumFractionDigits(digit);
String finalResult=nt.format(result);returnfinalResult;
}
}/*** 两个数相加
*@paramstr1
*@paramstr2
*@return
*/
bigdecimal除法保留小数public staticString add(String str1,String str2) {try{return new BigDecimal(str1).add(newBigDecimal(str2)).toPlainString();
}catch(Exception e){return null;
}
}/*** 两个数相乘
*@paramstr1
*@paramstr2
*@return
*/
public staticString multiply(String str1,String str2) {try{return new
BigDecimal(str1).multiply(newBigDecimal(str2)).toPlainString();
}catch(Exception e){return null;
}
}/*** 两个数相减
*@paramstr1
*@paramstr2
*@return
*/
public staticString subtract(String str1,String str2) {try{return new
BigDecimal(str1).subtract(newBigDecimal(str2)).toPlainString();
}catch(Exception e){return null;
}
}/*** 两个数相除
*@paramstr1
*@paramstr2
*@return
*/
public staticString divide(String str1,String str2) {try{return new BigDecimal(str1).divide(new BigDecimal(str2),5).toPlainString();
}catch(Exception e){
e.printStackTrace();return null;
}
}/*** 四舍六⼊五五成双
*@paramstr*/
public staticString FourUpSixInto(String str){
BigDecimal b1= newBigDecimal(str);
BigDecimal b2= b1.setScale(2, BigDecimal.ROUND_HALF_EVEN);String();
}
}
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]