由于在一个政府合作的项目中用到了大量的数据计算,对数据的处理要求极高,平时我们要求的都是四舍五入来处理数据,这个完全可以用安卓的api来进行做到:
安卓api的四舍五入:
import java.math.BigDecimal;
//参数scale,要保留的位数
public static double round(double num, int scale) {
BigDecimal bd = new BigDecimal(num);
return bd.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static BigDecimal round(String num, int scale) {
BigDecimal bd = new BigDecimal(num);
return bd.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP);
}
但我们的需求有点变态,需要根据用户输入的一组数据来进行计算,要求四舍六入五考虑,五前为0则舍去,五后非零则进一,还有一个要求是,如果一组数据里面有一个小数点,则对应算出该组数的平均值应该为小数点后2位,,依次类推
//参数values是所有的原始数据
public static float get(String[] values, String f) { //封装四舍五考虑六入,参数是保留的小数点位数
int num = 0;
for (int i = 0; i < values.length; i++) {
if (ConfirmDataType.isNumber(values[i])) {
if (values[i].contains(".")) {
if (num <= values[i].substring(values[i].indexOf(".") + 1).length()) {
num = values[i].substring(values[i].indexOf(".") + 1).length();
}
}
}
}
int dot2 = num - 1;
if (f.contains(".")) { //计算的有小数
int len1 = f.substring(f.indexOf(".") + 1).length();
if (len1 < dot2) {
// StringBuilder builder=new StringBuilder(f);
for (int i = 0; i < dot2 - len1 + 1; i++) {
// builder.append("0");
f = f + "0";
}
// f=builder.toString();
} else if (len1 == dot2) {
f = f;
} else if (len1 > dot2) { //当计算结果位数大于应该保留的小数位数时,进行四舍六入判断
if (dot2 + 1 < len1) {
//四舍六入五考虑
String s = f.substring(f.indexOf(".") + dot2 + 2, f.indexOf(".") + dot2 + 3);
int c = Integer.parseInt(s);
if (c <= 4) { //四舍
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
if (f.substring(f.length() - 1).equals(".")) f = f.replace(".", "");
} else if (c == 5) { //五考虑
if (len1 - dot2 - 1 == 1) {//5后皆0视奇偶
if (ConfirmDataType.isNumber(f.substring(f.indexOf(".") + dot2 + 1, f.indexOf(".") + dot2 + 2))) {
int i = Integer.parseInt(f.substring(f.indexOf(".") + dot2 + 1, f.indexOf(".") + dot2 + 2));
if (i % 2 == 0) { //5前为偶则舍去
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
if (f.substring(f.length() - 1).equals("."))
f = f.replace(".", "");
} else { //5前为奇则进一
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int w = 0; w < item.length; w++) {
item[w] = f.substring(w, w + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int w = 0; w < item.length; w++) {
item[w] = f.substring(w, w + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int w = 0; w < item.length; w++) {
if (item.length - (dot2 + 1) == w) {
b.append(".");
b.append(item[w]);
} else {
b.append(item[w]);
}
}
f = b.toString();
}
} else {
f = f.substring(0, f.indexOf("."));
if (ConfirmDataType.isNumber(f.substring(f.length() - 1))) {
if (Integer.parseInt(f.substring(f.length() - 1)) % 2 == 0) {
f = f;
} else { //5前为奇数则进一
f = Long.parseLong(f) + 1 + "";
}
}
}
} else { //5后非零进一
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < item.length; i++) {
if (item.length - (dot2 + 1) == i) {
b.append(".");
b.append(item[i]);
} else {
b.append(item[i]);
}
}
f = b.toString();
}
} else if (c > 5) { //六入
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int i = 0; i < item.length; i++) {
// TODO: 2017/8/21 0021 java.lang.StringIndexOutOfBoundsException: length=2; regionStart=2; regionLength=1
item[i] = f.substring(i, i + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < item.length; i++) {
if (item.length - (dot2 + 1) == i) {
b.append(".");
b.append(item[i]);
} else {
b.append(item[i]);
}
}
f = b.toString();
}
} else if (dot2 + 1 == len1) {
f = f;
}
}
} else { //计算的平均值没有小数
// StringBuilder builder=new StringBuilder(f);
for (int i = 0; i < dot2; i++) {
if (i == 0) {
// builder.append(".0");
f = f + ".0";
} else {
// builder.append("0");
f = f + "0";
}
}
// f=builder.toString();
}
if (ConfirmDataType.isNumber(f)) {
return Float.parseFloat(f);
} else {
return 1f;
}
}
public static float get(int num, String f) { //封装四舍五考虑六入,参数是保留的小数点位数
int dot2 = num - 1;
if (f.contains(".")) { //计算的标准差有小数
int len1 = f.substring(f.indexOf(".") + 1).length();
if (len1 < dot2) {
// StringBuilder builder=new StringBuilder(f);
for (int i = 0; i < dot2 - len1 + 1; i++) {
// builder.append("0");
f = f + "0";
}
// f=builder.toString();
} else if (len1 == dot2) {
f = f;
} else if (len1 > dot2) { //当计算结果位数大于应该保留的小数位数时,进行四舍六入判断
if (dot2 + 1 < len1) {
//四舍六入五考虑
String s = f.substring(f.indexOf(".") + dot2 + 2, f.indexOf(".") + dot2 + 3);
int c = Integer.parseInt(s);
if (c <= 4) { //四舍
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
if (f.substring(f.length() - 1).equals(".")) f = f.replace(".", "");
} else if (c == 5) { //五考虑
if (len1 - dot2 - 1 == 1) {//5后皆0视奇偶
if (ConfirmDataType.isNumber(f.substring(f.indexOf(".") + dot2 + 1, f.indexOf(".") + dot2 + 2))) {
int i = Integer.parseInt(f.substring(f.indexOf(".") + dot2 + 1, f.indexOf(".") + dot2 + 2));
if (i % 2 == 0) { //5前为偶则舍去
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
if (f.substring(f.length() - 1).equals("."))
f = f.replace(".", "");
} else { //5前为奇则进一
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int w = 0; w < item.length; w++) {
item[w] = f.substring(w, w + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int w = 0; w < item.length; w++) {
item[w] = f.substring(w, w + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int w = 0; w < item.length; w++) {
if (item.length - (dot2 + 1) == w) {
b.append(".");
b.append(item[w]);
} else {
b.append(item[w]);
}
}
f = b.toString();
}
} else {
f = f.substring(0, f.indexOf("."));
if (ConfirmDataType.isNumber(f.substring(f.length() - 1))) {
if (Integer.parseInt(f.substring(f.length() - 1)) % 2 == 0) {
f = f;
} else { //5前为奇数则进一
f = Long.parseLong(f) + 1 + "";
}
}
}
} else { //5后非零进一
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < item.length; i++) {
if (item.length - (dot2 + 1) == i) {
b.append(".");
b.append(item[i]);
} else {
b.append(item[i]);
}
}
f = b.toString();
}
} else if (c > 5) { //六入
f = f.split(dot_marker)[0] + "." + f.substring(f.indexOf(".") + 1, f.indexOf(".") + 1 + dot2 + 1);
f = f.replace(".", "");
String[] item = new String[f.length()];
for (int i = 0; i < item.length; i++) {
item[i] = f.substring(i, i + 1);
}
if (item.length > 0) {
if (Long.parseLong(item[item.length - 1]) < 9) {
item[item.length - 1] = Long.parseLong(item[item.length - 1]) + 1 + "";
} else {
if (f.substring(0, 1).equals("0")) { //首位为0
f = "1" + f;
f = Long.parseLong(f) + 1 + "";
f = f.substring(1);
} else {
f = Long.parseLong(f) + 1 + "";
}
// TODO: 2017/10/19 0019
if (f.length() > item.length) {
item = new String[f.length()];
}
for (int i = 0; i < item.length; i++) {
// TODO: 2017/8/21 0021 java.lang.StringIndexOutOfBoundsException: length=2; regionStart=2; regionLength=1
item[i] = f.substring(i, i + 1);
}
}
}
StringBuilder b = new StringBuilder();
for (int i = 0; i < item.length; i++) {
if (item.length - (dot2 + 1) == i) {
b.append(".");
b.append(item[i]);
} else {
b.append(item[i]);
}
}
f = b.toString();
}
} else if (dot2 + 1 == len1) {
f = f;
}
}
} else { //计算的平均值没有小数
// StringBuilder builder=new StringBuilder(f);
for (int i = 0; i < dot2; i++) {
if (i == 0) {
// builder.append(".0");
f = f + ".0";
} else {
// builder.append("0");
f = f + "0";
}
}
// f=builder.toString();
}
if (ConfirmDataType.isNumber(f)) {
return Float.parseFloat(f);
} else {
return 1f;
}
}