数据修约规则
修约描述:四舍六入,奇进偶不进;保留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) {//有效位数不够,补0int 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 {//补0for (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;}