/**
* 展示几个有效小数位
* 有效位从小数点非零数字后开始计算
* 末尾如果是零则会省略
* @param value 原始数据
* @param size 保留几位非零有效数字
* @return string
*/
public static String displaySignificantValue(double value, int size) {
//第一个非零数字的标识
boolean isNotZero = false;
//获取不使用科学计数法的字符串 #要足够需要的数值范围 不够可以加 可多不可少 (这一步很重要,有更好的不使用科学计数法显示的办法可替换)
DecimalFormat df = new DecimalFormat("#.############################");
String valueStr = df.format(value);
//通过小数点 截取两个字符串
String[] valueStrs = valueStr.split("\\.");
if (valueStrs.length < 2) {
return valueStrs[0];
}
//从第一个非零数字开始直到最后数字的字符串
StringBuffer notZeroSb = new StringBuffer();
//用于统计最终结果
StringBuffer resultSb = new StringBuffer(valueStrs[0] + ".");
for (char numChar : valueStrs[1].toCharArray()) {
if (numChar != '0') {
isNotZero = true;
}
if (isNotZero) {
notZeroSb.append(numChar);
} else {
resultSb.append("0");
}
}
//有效数值字符串
String notZeroNumsStr = notZeroSb.toString();
//按设定位数拼接有效数值
for (int i = 0; i < size; i++) {
if (i < notZeroNumsStr.length()) {
resultSb.append(notZeroNumsStr.charAt(i));
} else {
break;
}
}
//最终结果
var resultStr = resultSb.toString();
//用来统计末尾的零
var index = 0;
//统计末尾的零的个数
for (int i = resultStr.length() - 1; i >= 0; i--) {
if (resultStr.charAt(i) == '0') {
index++;
} else {
break;
}
}
//去掉末尾的零
if (index != 0) {
resultStr = resultStr.substring(0, resultStr.length() - index);
}
return resultStr;
}
输出结果:
算法可以按需修改,如果有更好的方法欢迎分享