一、涉及到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)); }