您的位置:首页 > 其它

解决Double类型的金额字段中使用保留两位小数并四舍五入的问题

2017-08-28 00:00 766 查看
一、涉及到js计算的精度问题,toFixed(2)在js中,会出现如下情况:

eg:var yanglaoFee = 76.925;

var shiyeFee = 76.935;

当执行toFixed(2)时,js会判断如果小数点后的第三位值为5,之后会判断小数点后第二位的值是否是偶数,偶数:不进位(计算结果为76.92);奇数:进位(计算结果为76.94)

为避免以上情况对金额计算的影响,将特殊情况进行单独处理,实现代码如下:

//解决toFixed(precision)问题方法
function round(number, precision) {
var str = number + '';
if (str.indexOf(".") == -1) {
return number.toFixed(precision);
} else {
var len = str.length;
var last = str.substr(len - 1, len);
if (last == '5' && str.split(".")[1].length > precision) {
last = '6';
str = str.substr(0, len - 1) + last;
return (str - 0).toFixed(precision)
} else {
return number.toFixed(precision)
}
}
}

二、后台java代码在实现保留两位小数的操作时,常用:

DecimalFormat df = new DecimalFormat("#.00");
Double yanglaoFee = Double.valueOf(df.format(val));

DecimalFormat("#.00")也会出现小数点后第三位值为5时进位与否判断小数点后第二位奇偶的情况,处理代码如下:

/**
*
* @Method: decimalCalculation
* @Description: 小数计算(四舍五入):解决DecimalFormat("#.00")使用时小数点后第三位值为5,第二位为偶数时无法进位的问题
* @创建人:guozq
* @创建时间:2017年8月24日
* @修改人:
* @param
* @param startVal
* @return double
*/
public double decimalCalculation(Double startVal){
DecimalFormat df = new DecimalFormat("#.00");
String startStr = startVal.toString();
String startDecimal = startStr.split("\\.")[1];
Double jishu = 0.01;
Double endVal = 0.0;
if(startDecimal.length()>2 && "5".equals(String.valueOf(startDecimal.charAt(2))) &&
Integer.parseInt(String.valueOf(startDecimal.charAt(1)))%2==0){
endVal = Double.valueOf(startStr.substring(0, startStr.length()-1))+jishu;
} else{
endVal = Double.valueOf(df.format(startVal));
}
return Double.valueOf(df.format(endVal));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息