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

本文探讨了JavaScript和Java中处理小数计算时遇到的精度问题,并提供了两种语言下针对toFixed及DecimalFormat方法的改进方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://my.oschina.net/miwang/blog/1524855

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值