要求:
1、输入几位保留几位
2、保留的有效位数后一位有数字直接进位
3、结果保留科学计数法
代码:
/**
* 格式化数字,保留指定位数,如果下一位是非零数字则向上取整。
*
* @param data 要格式化的数字
* @param numberCnt 总位数(包括整数和小数部分)
* @return 格式化后的字符串
*/
public static String formatNumber(double data, int numberCnt) {
BigDecimal bd = new BigDecimal(data);
// 如果totalDigits小于或等于0,直接返回原数
if (numberCnt <= 0) {
return Double.toString(data);
}
// 计算整数部分的位数
int integerPartLength = bd.precision() - bd.scale();
// 如果需要保留的位数小于或等于整数部分的位数,只处理整数部分
if (numberCnt <= integerPartLength) {
int shift = integerPartLength - numberCnt;
bd = bd.setScale(-shift, RoundingMode.UP);
} else {
// 否则,保持整数部分不变,只处理小数部分
int decimalPlaces = numberCnt - integerPartLength;
bd = bd.setScale(decimalPlaces, RoundingMode.UP);
}
// 格式化并返回数字
String plainString = bd.toPlainString();
DecimalFormat df = new DecimalFormat();
// 构建科学记数法的模式字符串
StringBuilder pattern = new StringBuilder("0.");
for (int i = 0; i < numberCnt - 1; i++) {
pattern.append("0");
}
pattern.append("E0");
// 应用模式字符串
df.applyPattern(pattern.toString());
// 格式化数字并返回
String scientificString = df.format(Double.parseDouble(plainString));
// 拆分科学记数法字符串
String[] parts = scientificString.split("E");
if (parts.length != 2) {
throw new IllegalArgumentException("Invalid scientific notation: " + scientificString);
}
// 解析系数和指数
String coefficient = parts[0];
int exponent = Integer.parseInt(parts[1]);
String end;
// 处理正负号
if (exponent >= 0) {
end = "+" + exponent;
} else {
end = String.valueOf(exponent);
}
// 构造带有 "x10^" 的格式化字符串
String result = coefficient + "x10^" + end;
return result.replace(".x","x");
}