数据修约规则
修约描述:四舍六入,奇进偶不进;保留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;
}