修约规则口诀: 四舍六入五考虑, 五后非零就进一, 五后皆零看奇偶, 五前为偶应舍去, 五前为奇要进一。 //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; }