1.Java处理银行中金额数据有精度问题
主要原因是十进制转为二进制循环;会转换不完整。
2.Java中BigDecimal处理精度问题
java类的float和double浮点数很多是有精度问题,比如:
'''
Double a= 0.9;
Double b = 0.1;
System.out.println(a+b); //输出1.0
Double a1 = 0.7;
Double b1 = 0.2;
System.out.println(a1+b1); //输出0.8999999999999999
'''
怎么解决呢?一般是用BigDecimal类来解决,如果要深究原理,可以参考其他大佬的文章。
3.作者本人写的工具方法,仅供参考。
'''
/**
* 金额加法
* @param value1 加数1
* @param vaule2 加数2
* @return 总和
*/
public static Double add(Double value1,Double vaule2) {
BigDecimal bigD1 = new BigDecimal(value1.toString());
BigDecimal bigD2 = new BigDecimal(vaule2.toString());
return bigD1.add(bigD2).doubleValue();
}
/**
* 金额减法
* @param value1 被减数
* @param vaule2 减数
* @return 两数的差
*/
public static Double subtraction(Double value1,Double vaule2) {
BigDecimal bigD1 = new BigDecimal(value1.toString());
BigDecimal bigD2 = new BigDecimal(vaule2.toString());
return bigD1.subtract(bigD2).doubleValue();
}
/**
* 金额的积
* @param value1 乘数1
* @param vaule2 乘数2
* @return 两数的积
*/
public static Double multipliction(Double value1,Double vaule2) {
BigDecimal bigD1 = new BigDecimal(value1.toString());
BigDecimal bigD2 = new BigDecimal(vaule2.toString());
return bigD1.multiply(bigD2).doubleValue();
}
/**
* 金额的商
* @param value1 被除数
* @param vaule2 除数
* @return 两数的商
*/
public static Double division(Double value1,Double vaule2) throws IllegalAccessException {
BigDecimal bigD1 = new BigDecimal(value1.toString());
BigDecimal bigD2 = new BigDecimal(vaule2.toString());
return bigD1.divide(bigD2).doubleValue();
}
/**
* 保留两位小数
* @param value1
* @return 四舍五入法
* @throws IllegalAccessException
*/
public static Double setScale(Double value1) throws IllegalAccessException {
BigDecimal bigD1 = new BigDecimal(value1.toString());
return bigD1.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
}
'''