ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java代码实现保留小数的奇入偶不入,四舍六入的计算

2020-12-31 16:00:16  阅读:628  来源: 互联网

标签:六入 numStr Java String 偶不入 substring length indexFixed fixed


Java代码实现保留小数的奇入偶不入,四舍六入的计算

点击可查看Vue中使用js实现保留小数的奇入偶不入,四舍六入的计算

使用java实现保留小数,修约:五后有值就入位,皆零看奇偶,五前为偶应舍去,五前为奇要进一,四舍,六入。

/**
* @Description: TODO 计算修约:四舍六入奇进偶不进,
 *  1.五后有值就入位,皆零看奇偶,五前为偶应舍去,五前为奇要进一,
 *  2.四舍,六入。参数1:需要修约的数,
 *  参数2修约多少位.传入的一定要是数字,否则会报异常。且传入的数末尾0需去掉
* @author: xgq
* @date: 2020/12/31 10:57
* @Return:
*/
public static String repairRound(String numStr, Integer fixed) {
    Integer index = numStr.indexOf(".");
    /** 没有小数,直接返回原数*/
    if (index == -1) {
        return numStr;
    }
    /** 去除小数点后的尾部0,保留到保留位数*/
    numStr = removeEndZero(numStr, fixed);
    /** 取到保留小数位的下一位,5.5555取保留俩位,那就是小数点后第三位*/
    Integer indexFixed = index + fixed +1;
    /** 如果小数位数不够补零后就直接返回,不做其他处理*/
    if (indexFixed >= numStr.length()) {
        return zeroFill(numStr, fixed);
    }
    /** 取保留位数的后一位做判断位,用来判断是否进位*/
    String judgeNumber = numStr.substring(indexFixed, indexFixed + 1);
    /** 如果判断位不为五,按四舍六入算,也就是正常的四舍五入就行了,numStr不是数字会报异常,"%."+ fixed + "f";fixed是几位就保留几位*/
    if (!"5".equals(judgeNumber)) {
        numStr = String.format("%."+ fixed + "f", Double.parseDouble(numStr));
        return zeroFill(numStr, fixed);
    }
    /** 判断位为5,看小数位最后一位是不是0,不是0进位,是0就看前面一位是奇数还是偶数,奇数进偶数不进,由于末尾多余0已去除,所以只需要判断判断位是不是最后一位,是就看奇偶,不是直接进位*/
    if (indexFixed < (numStr.length() -1)) {
        /** 五后有数且不为0进位,此处要考虑到是正数还是负数,startsWith("-")检测前缀以-开始,先要截取到保留的位数,在进行计算*/
        /** 要考虑到1440.5这种情况取0位小数会留下逗号,*/
        numStr = handleRadixPoint(numStr, indexFixed);
        numStr = plusMinusCarry(numStr, fixed);
        return zeroFill(numStr, fixed);
    }
    /** 看奇进偶不进,取当前判断位的上一位作为判断位*/
    judgeNumber = numStr.substring(indexFixed - 1, indexFixed);
    /** 如果取到的判断位是.表示需要重新再取点的左边一位,也就是个位*/
    if (".".equals(judgeNumber)) {
        judgeNumber = numStr.substring(indexFixed - 2, indexFixed - 1);
    }
    /** 偶不进,如果是1440.5这种情况取0位小数会留下逗号,需要加判断。判断位是'.'的,截取字符需要排除'.',小数位不够需补零*/
    numStr = handleRadixPoint(numStr, indexFixed);
    /** 奇进:判断位为奇数就进位*/
    if ("13579".contains(judgeNumber)) {
        numStr = plusMinusCarry(numStr, fixed);
    }

    return zeroFill(numStr, fixed);
}
/** 逗号处理,截取小数位,比如1440.5这种情况取0位小数会留下逗号*/
public static String handleRadixPoint(String numStr, Integer indexFixed) {
    if (".".equals(numStr.substring(indexFixed - 1, indexFixed))) {
        numStr =  numStr.substring(0, indexFixed -1);
    } else {
        numStr = numStr.substring(0, indexFixed);
    }
    return numStr;
}
/**
 * 去除小数后的尾部多余零,保留到保留位数的结果,numStr.substring(0, numStr.length() - 1);从0开始,取numStr.length() - 1的下标位位,
 * substring的参数2时从0开始算但是0时截取不到字符的,1开始才可以截取字符的。*/
public static String removeEndZero(String numStr, Integer fixed) {
    if (fixed == numStr.substring(numStr.indexOf("."),(numStr.length() -1)).length()) {
        return numStr;
    } else if ("0".equals(numStr.substring(numStr.length() - 1))) {
        numStr = numStr.substring(0, numStr.length() - 1);
        numStr = removeEndZero(numStr, fixed);
    } else if (".".equals(numStr.substring(numStr.length() - 1))) {
        numStr = numStr.substring(0, numStr.length() - 1);
    }
    return numStr;
}
/**
 * 正负数判断进位*/
public static String plusMinusCarry(String numStr, Integer fixed) {
    System.out.println("numStr:"+numStr);
    if (numStr.startsWith("-")) {
        numStr = String.format("%."+ fixed + "f", Double.parseDouble(numStr) - Math.pow(10, -fixed));
    } else {
        numStr = String.format("%."+ fixed + "f", Double.parseDouble(numStr) + Math.pow(10, -fixed));
    }

    return numStr;
}
/**
 * 补零,当小数位不够时需要补零*/
public static String zeroFill(String numStr, Integer fixed) {
    /** 根据传入的保留小数位数,将不够的小数位数补0,保留小数位-现有的小数位,如果大于0表示要补零,其他原样返回*/
    if (numStr.indexOf(".") == -1) {
        return numStr;
    }
    fixed = fixed - numStr.substring(numStr.indexOf("."),(numStr.length() -1)).length();
    if (fixed > 0) {
        for (int i = 0; i < fixed; i ++) {
            numStr += "0";
        }
    }
    return numStr;
}
public static void main(String[] args) {
    String numStr = "1440.5";
    System.out.println(numStr.substring(0,0));
    System.out.println(repairRound(numStr, 0));
}

标签:六入,numStr,Java,String,偶不入,substring,length,indexFixed,fixed
来源: https://blog.csdn.net/qq_44750520/article/details/112018522

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有