概述
1、数据库中涉及到金额、价格问题的,建议字段设置成 decimal(m,n),否则会造成精度丢失,对应java中实体类的属性BigDecimal修饰;
2、使用string参数的构造方法,new BigDecimal(string),若使用double参数的构造方法,会产生你不想要的结果;
3、用compareTo方法比较两值是否相等,而不是equals,equals会比较scale(保留位数),例如2和2.0用equals比较不相等;
4、使用BigDecimal处理高精度的数值计算,是消耗一定的效率为前提的;
5、封装公用类
public class BigDecimalUtil implements Serializable {
private static final long serialVersionUID = -8410008519165745518L;
private BigDecimalUtil(){}
/**
* 精确加法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal add(String v1,String v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.add(b2));
return b1.add(b2);
}
/**
* 指定精度的加法(这里四舍五入了,可以替换BigDecimal.ROUND_H ALF_UP)
* 更过精度可以查看BigDecimal类
* @param v1
* @param v2
* @param scale 保留的位数
* @return
*/
public static BigDecimal add(String v1,String v2,int scale){
if(scale<0){
throw new IllegalArgumentException("scale must be positive or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.add(b2).setScale(scale,BigDecimal.ROUND_HALF_UP));
return b1.add(b2).setScale(scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确减法
*
* @param v1
* @param v2
* @return
*/
public static BigDecimal subtract(String v1,String v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.subtract(b2));
return b1.subtract(b2);
}
/**
* 指定精度的减法
*
* @param v1
* @param v2
* @param scale
* @return
*/
public static BigDecimal subtract(String v1,String v2, int scale){
if(scale<0){
throw new IllegalArgumentException("scale must be positive or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.subtract(b2).setScale(scale,BigDecimal.ROUND_HALF_UP));
return b1.subtract(b2);
}
// 乘法
public static BigDecimal multiply(String v1,String v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.multiply(b2));
return b1.multiply(b2);
}
// 除法
public static BigDecimal divide(String v1,String v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
System.out.println(b1.divide(b2, 2 ,BigDecimal.ROUND_HALF_UP));
return b1.divide(b2, 2 ,BigDecimal.ROUND_HALF_UP);
}
}
最后
以上就是大气羽毛为你收集整理的BigDecimal解决精度问题的全部内容,希望文章能够帮你解决BigDecimal解决精度问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复