[size=large]最近有个需求是对一个double值,保留3位小数,如果整数位为零,则小数点后保留3个有效值。[/size]
[size=large][color=red]下面是实现代码,如果有更好的办法,请告诉我,谢谢![/color][/size]
[size=large][color=red]下面是实现代码,如果有更好的办法,请告诉我,谢谢![/color][/size]
private static final int DEFAULT_SCALE = 3;//默认保留三位
private static final int MAX_SCALE = 9;//最大保留9位
private static final String INTEGER_BIT_NOT_ZERO = "(0([.](0+|[0-9]{1,3}))?)|(-?[1-9][0-9]*([.][0-9]+)?)";//不包括整数位为0,小数位超过三位的正则
private static final String INTEGER_BIT_IS_ZERO = "0[.]0*[1-9][0-9]{0,2}";//获取需要保留小数位的精度的正则
private double formatNumber(double value)
{
BigDecimal bigDecimal = BigDecimal.valueOf(value);
int scale = DEFAULT_SCALE;
if (!bigDecimal.toString().matches(INTEGER_BIT_NOT_ZERO))
{
Matcher matcher = Pattern.compile(INTEGER_BIT_IS_ZERO).matcher(
bigDecimal.toString());
if (matcher.find())
{
scale = matcher.group().length() - 2;
}
else
{
scale = MAX_SCALE;//因为如果是科学计数的形式,这儿会匹配不成功,所以给个默认的精度
}
}
return bigDecimal.setScale(scale, RoundingMode.HALF_UP).doubleValue();
}