一、处理修约精度
1、主方法体
/**
* 修约精度
* @param num{数值}
* @param len{精度(1、0.5、10、0.1、0.01)}
* @param even{修约(四舍五入、四舍六入)}
* @returns {number}
*/
var cpEvenRound = function(num, len,even) {
try {
if(isNaN(Number(num))){
return num;
}
num = numDecimal(num,10);
num = Number(num);
var d = ((len || 0).toString().trim() || 0);
var rule = (even!=undefined&&(even.toString().indexOf("5")!=-1||even.toString().indexOf("五")!=-1))?5:6;
if (len=="0.5"){
//TODO 精度为 0.5 时
//(0.75 * 2).修约 / 2
if (rule==5)
num = fiveRound(num*2,0)/2;//四舍五入
else
num = sixRound(num*2,0)/2;//四舍六入
//小数位自动补 "0"
num = numDecimal(num,1);
}else if (len=="5"){
//TODO 精度为 ”5“ 时 ,个位只会是(0 | 5)
//(0.75 * 0.2).修约 / 0.2
if (rule==5)
num = fiveRound(num*0.2,0)/0.2;//四舍五入
else
num = sixRound(num*0.2,0)/0.2;//四舍六入
//小数位自动补 "0"
num = numDecimal(num,0);
}else if (len=="10"){
//TODO 精度为 ”10“ 时
//(0.75 / 10).修约 * 10
if (rule==5)
num = fiveRound(num/10,0)*10;//四舍五入
else
num = sixRound(num/10,0)*10;//四舍六入
}else {
//小数点后有几位,就保留几位小数,例:0.1、0.01
if (len!=undefined&&len.toString().split(".").length>1)
d = len.toString().split(".")[1].length;
else d = 0;
if (rule==5)
num = fiveRound(num,d);
else
num = sixRound(num,d);
//小数位自动补 "0"
num = numDecimal(num,d);
}
}catch (e) {
console.log("修约错误:"+e.message);
}
console.log("修约结果:"+num);
return num;
}
2、四舍五入
/**
* 四舍五入
* @param num
* @param decimalPlaces{小数位}
* @returns {number}
*/
var fiveRound = function(num, decimalPlaces) {
var d = decimalPlaces || 0;
return Math.round(num * Math.pow(10, d)) / Math.pow(10, d);
}
3、四舍六入
/**
* 四舍六入
* @param num
* @param decimalPlaces{小数位}
* @returns {number}
*/
var sixRound = function(num, decimalPlaces) {
var d = decimalPlaces || 0;
var m = Math.pow(10, d);
var n = +(d ? num * m : num).toFixed(8);
var i = Math.floor(n), f = n - i;
var e = 1e-8;
var r = (f > 0.5 - e && f < 0.5 + e) ?
((i % 2 == 0) ? i : i + 1) : Math.round(n);
return d ? r / m : r;
}
//规则:
//四舍六入五考虑,
//五后非零就进一,
//五后皆零看奇偶,
//五前为偶应舍去,
//五前为奇要进一。
4、小数位不够自动补 “0”
/**
* 小数位不够自动补 “0”
* @param num {数值}
* @param len {保留几位小数}
*/
var numDecimal = function(num,len){
num = ((num || 0).toString().trim() || 0);
len = ((len || 0).toString().trim() || 0);
if (len == "0") return num.split(".")[0];
if (num.toString().indexOf(".") == -1 && len != 0){
num = (num + ".0");
}
var split = num.toString().split(".");
var decimal = split[1].toString();
num = split[0].toString();
if (decimal.length>len){
decimal = decimal.substring(0,len);
}else {
while (decimal.length != len){
decimal += "0";
}
}
return num+"."+decimal;
}