四舍六入,奇进偶不进

文章详细介绍了Java中的数据修约规则,包括四舍六入和奇进偶不进的原则,以及RTS函数的具体实现,通过字符串截取和判断后位数值进行精确控制。
摘要由CSDN通过智能技术生成

数据修约规则

修约描述:四舍六入,奇进偶不进;保留n位有效数字时,第n+1位小于等于4时舍去,第n+1位大于等于6时进位。第n+1为5时,则判断第n+2位为奇数还是偶数,为奇数时进位,为偶数时不进位。

用法:=RTS(A1,n),n为保留几位有效数字

例如:=RTS(1.23512,3)

值为1.24

原因:1.23后一位为5,5的后一位时1为奇数,需要进位,则为1.24

主要思路就是字符串截取,判断后一位的值,如果是5判断后两位的值

里面里面有不少重复判断代码,后续有空了再改改

    public static String RTS(String data, int numberCnt) {
        double num = Double.parseDouble(data);
        int pointPlace = data.indexOf("."); //小数点存在的位置
        if (data.contains(".") && data.length() < numberCnt) {
            //有效位数不够,补0
            int length = numberCnt - (data.length() - 1);
            for (int i = 0; i < length; i++) {
                data = data + 0;
            }
            return data;
        }
        //处理部分在小数
        if (data.contains(".") && pointPlace <= numberCnt) {
            int index = data.substring(0, numberCnt).contains(".") ? numberCnt + 1 : numberCnt;
            //保留的总位数是否够位
            if (data.length() - 1 >= numberCnt) {
                char c;
                //保留的数字为整数部分,判断小数点后一位
                if (index == numberCnt) {
                    c = data.charAt(index + 1);
                    if (c >= '6') { //
                        int i;
                        int add;
                        if (numberCnt == data.indexOf(".")) {
                            i = 1;
                            add = 10;
                        } else {
                            i = numberCnt - data.indexOf(".");
                            add = 1;
                        }
                        double pow = num * Math.pow(10, i);
                        pow = pow + add;
                        String s = String.valueOf(pow / Math.pow(10, i));
                        data = s.substring(0, index);

                    } else if (c <= '4') { //不变
                        data = data.substring(0, index);
                    } else if ((c == '5' && index + 1 < data.length())) {
                        //特殊情况  小数点的情况
                        if (numberCnt == data.indexOf(".")) {
                            if (data.length() - data.indexOf(".") == 2) { //先判断5后面还有没有值
                                data = data.substring(0, index);
                            } else if (data.charAt(index + 2) % 2 != 0) {
                                int i = numberCnt + 1 - data.indexOf(".");
                                double pow = num * Math.pow(10, i);
                                pow = pow + 10;
                                String s = String.valueOf(pow / Math.pow(10, i));
                                data = s.substring(0, index);
                            } else { //偶数不变
                                data = data.substring(0, index);
                            }
                        } else {
                            if (data.charAt(index + 1) % 2 != 0) { //奇数进一
                                int i = numberCnt + 1 - data.indexOf(".");
                                double pow = num * Math.pow(10, i);
                                pow = pow + 10;
                                String s = String.valueOf(pow / Math.pow(10, i));
                                data = s.substring(0, index);
                            } else { //偶数不变
                                data = data.substring(0, index);
                            }
                        }
                    } else {
                        data = data.substring(0, index);
                    }
                    return data;
                } else if (index == data.length()) {
                    return data;
                } else {
                    c = data.charAt(index);
                    if (c >= '6') { //
                        int i;
                        int add;
                        if (numberCnt == data.indexOf(".")) {
                            i = 1;
                            add = 10;
                        } else {
                            i = numberCnt - data.indexOf(".");
                            add = 1;
                        }
                        double pow = num * Math.pow(10, i);
                        pow = pow + add;
                        String s = String.valueOf(pow / Math.pow(10, i));
                        data = s.substring(0, index);

                    } else if (c <= '4') { //不变
                        data = data.substring(0, index);
                    } else if ((c == '5' && index + 1 < data.length())) {
                        //特殊情况  小数点的情况
                        if (numberCnt == data.indexOf(".")) {
                            if (data.length() - data.indexOf(".") == 2) { //先判断5后面还有没有值
                                data = data.substring(0, index);
                            } else if (data.charAt(index + 2) % 2 != 0) {
                                int i = numberCnt + 1 - data.indexOf(".");
                                double pow = num * Math.pow(10, i);
                                pow = pow + 10;
                                String s = String.valueOf(pow / Math.pow(10, i));
                                data = s.substring(0, index);
                            } else { //偶数不变
                                data = data.substring(0, index);
                            }
                        } else {
                            if (data.charAt(index + 1) % 2 != 0) { //奇数进一
                                int i = numberCnt + 1 - data.indexOf(".");
                                double pow = num * Math.pow(10, i);
                                pow = pow + 10;
                                String s = String.valueOf(pow / Math.pow(10, i));
                                data = s.substring(0, index);
                            } else { //偶数不变
                                data = data.substring(0, index);
                            }
                        }
                    } else {
                        data = data.substring(0, index);
                    }
                    return data;
                }
            } else {
                //补0
                for (int i = 0; i < numberCnt - (data.length() - 1); i++) {
                    data = data + 0;
                }
            }
            //保留的部分在整数部分
        } else if (numberCnt <= pointPlace - 1) {
            //保留的最后一位小数前最后一位
            if (numberCnt + 1 == pointPlace) {
                if (data.charAt(numberCnt) <=  '4') {
                    data = data.substring(0, numberCnt);
                    data = data + 0;
                } else if(data.charAt(numberCnt) >=  '6') {
                    data = data.substring(0, numberCnt);
                    double newStr = Double.parseDouble(data);
                    newStr = newStr + 1;
                    data = String.valueOf(newStr * Math.pow(10, 1));
                }else if(data.charAt(numberCnt) ==  '5'){
                    if (data.charAt(numberCnt + 2) % 2 != 0){
                        data = data.substring(0, numberCnt);
                        double newStr = Double.parseDouble(data);
                        newStr = newStr + 1;
                        data = String.valueOf(newStr * Math.pow(10, 1));
                        if (data.contains(".")) {
                            data = data.substring(0, data.indexOf("."));
                        }
                    }else {
                        data = data.substring(0, numberCnt);
                        data = data + 0;
                    }
                }
            } else {
                //剩下的处理逻辑和整数部分相同
                data = data.substring(0, data.indexOf("."));
                int differ = data.length() - numberCnt;
                char c = data.charAt(numberCnt);
                if (c >= '6') {
                    data = data.substring(0, numberCnt);
                    double newStr = Double.parseDouble(data);
                    newStr = newStr + 1;
                    data = String.valueOf(newStr * Math.pow(10, differ));
                } else if (c <= '4') {
                    data = data.substring(0, numberCnt);
                    for (int i = 0; i < differ; i++) {
                        data = data + 0;
                    }
                } else if (c == '5') {
                    if (numberCnt == data.length() - 1) { //先判断5后面还有没有值
                        data = data.substring(0, numberCnt);
                        data = data + 0;
                    } else if (data.charAt(numberCnt + 1) % 2 != 0) {
                        data = data.substring(0, numberCnt);
                        double newStr = Double.parseDouble(data);
                        newStr = newStr + 1;
                        data = String.valueOf(newStr * Math.pow(10, differ));
                        //结果包含.0 去除
                        if (data.contains(".")) {
                            data = data.substring(0, data.indexOf("."));
                        }
                    } else { //偶数不变
                        data = data.substring(0, numberCnt);
                        for (int i = 0; i < differ; i++) {
                            data = data + 0;
                        }
                    }
                }
            }
        } else {
            //处理数据为整数
            if (data.length() <= numberCnt) {
                return data;
            } else {
                int differ = data.length() - numberCnt;
                char c = data.charAt(numberCnt);
                if (c >= '6') {
                    data = data.substring(0, numberCnt);
                    double newStr = Double.parseDouble(data);
                    newStr = newStr + 1;
                    data = String.valueOf(newStr * Math.pow(10, differ));
                } else if (c <= '4') {
                    data = data.substring(0, numberCnt);
                    for (int i = 0; i < differ; i++) {
                        data = data + 0;
                    }
                } else if (c == '5') {
                    if (numberCnt == data.length() - 1) { //先判断5后面还有没有值
                        data = data.substring(0, numberCnt);
                        data = data + 0;
                    } else if (data.charAt(numberCnt + 1) % 2 != 0) {
                        data = data.substring(0, numberCnt);
                        double newStr = Double.parseDouble(data);
                        newStr = newStr + 1;
                        data = String.valueOf(newStr * Math.pow(10, differ));
                        //结果包含.0 去除
                        if (data.contains(".")) {
                            data = data.substring(0, data.indexOf("."));
                        }
                    } else { //偶数不变
                        data = data.substring(0, numberCnt);
                        for (int i = 0; i < differ; i++) {
                            data = data + 0;
                        }
                    }
                }
            }
        }
        return data;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值