Java实现数字修约规则

修约规则口诀:
四舍六入五考虑,
五后非零就进一,
五后皆零看奇偶,
五前为偶应舍去,
五前为奇要进一。

//value2 需要操作的值,decimalPlaces 希望保留的小数位数
public static String formatToEven(String value2,Integer decimalPlaces){
    BigDecimal num = new BigDecimal(value2);

    //尾数的字符串
    String needCheckChar = value2.substring(value2.length()-1);
    //尾数在整个字符串中的位置
    int needCheckIndex = value2.length()-1;
    //尾数的前一位
    String lastCheckChar = "";
    if(value2.length()>1){
        lastCheckChar = value2.substring(value2.length()-2,value2.length()-1);
    }

    if(!value2.contains(".") && decimalPlaces>=0){
        value2 = num.setScale(decimalPlaces, BigDecimal.ROUND_UP).toString();
        return value2;
    }
    if(value2.contains(".")){
        String[] arr = value2.split("\\.");
        if(arr[1].length()<= decimalPlaces){
            value2 = num.setScale(decimalPlaces, BigDecimal.ROUND_HALF_EVEN).toString();
            return value2;
        }
        needCheckChar = String.valueOf(arr[1].charAt(decimalPlaces));
        needCheckIndex = arr[0].length()+1+decimalPlaces;
        if(decimalPlaces == 0){
            lastCheckChar =  arr[0].substring(arr[0].length()-1);
        }else{
            lastCheckChar = String.valueOf(arr[1].charAt(decimalPlaces-1));
            if(lastCheckChar.equals(".")){
                lastCheckChar = String.valueOf(arr[1].charAt(decimalPlaces-2));
            }
        }
    }

    if(needCheckChar.equals("5")){//尾数为5
        if(value2.contains(".")){ //有小数点
            if(new BigDecimal(StringUtils.isEmpty(value2.substring(needCheckIndex+1))?"0":value2.substring(needCheckIndex+1)).compareTo(BigDecimal.ZERO)>0){//尾数后存在不为0的数字
                            value2 = num.setScale(decimalPlaces,BigDecimal.ROUND_UP).toString(); //向前进一位
            }else{//尾数后全是0,校验尾数的前一位(目标位数的最后一位)
                if(Integer.parseInt(lastCheckChar)%2==0){//尾数的前一位是偶数
                    value2 = value2.substring(0,needCheckIndex);//将尾数舍去
                }else{//尾数的前一位是奇数
                    value2 = num.setScale(decimalPlaces, BigDecimal.ROUND_HALF_EVEN).toString();
                }
            }
        }
    }else{//尾数不是4,需四舍六入
        value2 = num.setScale(decimalPlaces, BigDecimal.ROUND_HALF_EVEN).toString();//四舍六入
    }
    value2 = numDecimal(value2,decimalPlaces);
    return value2;
}

/**
 * 小数位不够自动补 “0”
 * @param num {数值}
 * @param len {保留几位小数}
 */
public static String numDecimal(String num,int len){
    num = StringUtils.isEmpty(num)?"0":toStr(num);
    if (len==0) return num.split("\\.")[0];
    String decimal;
    if (num.indexOf(".") == -1 && len!=0) num += ".0";
    String[] split = num.split("\\.");
    decimal = split[1];//
    num = split[0];
    if (decimal.length()>len){
        decimal = decimal.substring(0,len);
    }else {
        while (decimal.length() != len){
            decimal += "0";
        }
    }
    return num+"."+decimal;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值