在开发过程中,我们经常使用BigDecimal代替double的作用,实现更精确的表达,以下部分为使用示例
1:获取两个小数的相加
public static BigDecimal add(double num1, double num2){
BigDecimal bignum1 = new BigDecimal(num1);
BigDecimal bignum2 = new BigDecimal(num2);
return bignum1.add(bignum2);
}
2:获取两个小数的相减
public static BigDecimal subtract(double num1, double num2){
BigDecimal bignum1 = new BigDecimal(num1);
BigDecimal bignum2 = new BigDecimal(num2);
return bignum1.subtract(bignum2);
}
3:获取两个小数的相乘
public static BigDecimal multiply(double num1, double num2){
BigDecimal bignum1 = new BigDecimal(num1);
BigDecimal bignum2 = new BigDecimal(num2);
return bignum1.multiply(bignum2);
}
4:获取两个小数的相除
public static BigDecimal divide(double num1, double num2){
BigDecimal bignum1 = new BigDecimal(num1);
BigDecimal bignum2 = new BigDecimal(num2);
return bignum1.divide(bignum2,2,BigDecimal.ROUND_DOWN);
}
说明:注意:除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
divide方法:bignum1除以bignum2,保留两位小数
多余位坐进位处理,4.233->4.24:
bignum1.divide(bignum2,2,BigDecimal.ROUND_UP);
多余位坐舍弃处理,4.233->4.23:
bignum1.divide(bignum2,2,BigDecimal.ROUND_DOWN);
四舍五入,4.255->4.26:
bignum1.divide(bignum2,2,BigDecimal.ROUND_HALF_UP);
五舍六入,4.255->4.25:
bignum1.divide(bignum2,2,BigDecimal.ROUND_HALF_DOWN);
5:获取百分率(两decimal相除)
/**
* 获取百分率
*
* @param num 所求占比数据
* @param total 总数据量
* @param scale 精确到第几位
* @return
*/
public static String accuracy(double num, double total, int scale) {
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
//可以设置精确几位小数
df.setMaximumFractionDigits(scale);
//模式 例如四舍五入
df.setRoundingMode(RoundingMode.HALF_UP);
double accuracy_num = num / total * 100;
return df.format(accuracy_num) + "%";
}
获取百分率(double转换)
double pi=3.1415927;//圆周率
//以百分比方式计数,并取两位小数
new DecimalFormat("#.##%").format(pi);//314.16%