写在前面
我以前写过这个代码,但是没有记录就找不到了。我只能花时间重新百度。 然后记录测试结果。
返回值为double
public static <T extends Number> String getAvg(T left, T right, int bit) {
if (left == null || right == null || right.doubleValue() == 0) {
return null; } if (left.doubleValue() == 0) {
return "0.00"; } // 不需要判断是否left.intValue() == left.doubleValue() BigDecimal的api中整数用doubleValue也可以 BigDecimal leftBigDecimal = new BigDecimal(left.doubleValue()); BigDecimal rightBigDecimal = new BigDecimal(right.doubleValue()); // double div = left.doubleValue() / right.doubleValue(); 有问题 23.65/10后变成2.36499 // 小数位数必须指定,否则101/2将变为51 // 必须指定为四舍五入(小数截断模式) // 因爲leftBigDecimal23.64999 这种情况 所以保留位数 1 BigDecimal divide = leftBigDecimal.divide(rightBigDecimal,bit 1,ROUND_HALF_UP); //保留2位小数(包括无效0) return toRenDecimal(divide.floatValue());
}
去除无效的0
/** * 去除无效的0 * 正则 * 不处理科学计数法 */
public static String subZeroAndDot(String doubleStr) {
if (null != doubleStr && doubleStr.indexOf(".") > 0) {
//正则表达
doubleStr = doubleStr.replaceAll("0+?$", "");//去掉后面无用的零
doubleStr = doubleStr.replaceAll("[.]$", "");//如小数点后面全是零则去掉小数点
}
return doubleStr;
}
或者
return new BigDecimal(String.valueOf(v)).stripTrailingZeros().toPlainString();
需求
- 求百分比。即乘以100后再四舍五入,无效0不要。
- 四舍五入并保留2位小数。 两者是不一样的!
测试用例
3/8: 37.5%
小数不能直接乘100
2、注意项: 可以自己再试下的。所以再求百分比的时候不能由保留4位的小数乘100,而是应该先乘100后再保留2位小数。
System.out.println("0.25 x100="+0.25*100);
System.out.println("0.28 x100="+0.28*100);
0.25 x100=25.0
0.28 x100=28.000000000000004
小数也不能直接除以10
比如四舍五入26.56/10 结果应该是26.6吧 但是结果是26.5!! 因为26.56/10结果是2.64444444
2、这方法不行啊
测试后 0.8012 保存是0.801啊!
public static String toStr(Double bitMapDataByAvg) {
if (bitMapDataByAvg == null || bitMapDataByAvg.doubleValue() == 0) {
return "0.00";
}
DecimalFormat decimalFormat = new DecimalFormat("0.00#");
return decimalFormat.format(bitMapDataByAvg);
}
修改后如下,暂时可以的。 是否支持去除科学记数法再观察
public static String toRenDecimal(Double bitMapDataByAvg) {
if (bitMapDataByAvg == null || bitMapDataByAvg.doubleValue() == 0) {
return "0.00";
}
DecimalFormat decimalFormat = new DecimalFormat("0.00#");
//不设置 则0.801会保存为0.801
decimalFormat.setMinimumFractionDigits(2);
decimalFormat.setMaximumFractionDigits(2);
return decimalFormat.format(bitMapDataByAvg);
}