转换过程中,先转换为字符串为保证数据转换无误,异常数据若直接使用BigDecimal转换可能会出现不可估计的影响。
/**
* 设置数据精度
* <p>一位数保留2位小数</p>
* <p>两位数保留1位小数</p>
* <p>三位数保留整数</p>
*
* @param value 需要处理的double类型数据
* @return 处理完成的数据
*/
private double setDataAccuracy(double value) {
try {
BigDecimal bigDecimal;
DecimalFormat dt = (DecimalFormat) DecimalFormat.getInstance(); // 获得格式化类对象
dt.applyPattern("0.0000");// 保存4位小数
String str = dt.format(value);//转换为四位小数的等效字符串
bigDecimal = new BigDecimal(str);
double num = Math.abs(value);
int nAccuracy = num < 10 ? 3 : num < 100 ? 2 : num < 1000 ? 1 : 0;//获取数据精度值
if (nAccuracy == 0) {
return Math.round(value);
}
//保留有效数字,四舍五入法
value = bigDecimal.setScale(nAccuracy, BigDecimal.ROUND_HALF_UP).doubleValue();
return value;
} catch (Exception e) {
return Math.round(value);
}
}