最近在做android上的商城应用 使用到 double 进行加减计算是出现 错误 时不时出现浮点数计算不精确的问题。
纠结好久,以为我所学到的加减乘除已经out了。。
下面这个错误:
398649.9+0.2 = 398650.10000000003
着实让我无语。
其实并不是我的用法有问题,而是对 double这种数据类型了解的不深而已,只停留在表面上的数字,没有去深究其构成。
http://tech.ccidnet.com/art/3737/20031021/455723_1.html
在网上找了一些资料 找到些比较好的解决方案,贴出来 备忘。。。
一下在网上搜索到整理比较完善的解决方法:
//商业用java浮点数精度计算
/**
* 提供精确的乘法运算
* @param v1
* @param v2
* @param scale :保留精度,BigDecimal.ROUND_HALF_EVEN:财务常用的四舍六入五取偶,BigDecimal.ROUND_HALF_UP,包括>=.5就进位,比如3.455保留两位为3.46
* @return 两个参数的积
*/
public static double multiply(double v1, double v2,int scale)
{
return (BigDecimal.valueOf(v1).multiply(BigDecimal.valueOf(v2))).setScale(scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
}
/**
* 提供精确的加法运算
* @param v1
* @param v2
* @param scale :保留精度
* @return 两个参数的和
*/
public static double add(double v1, double v2,int scale)
{
return (BigDecimal.valueOf(v1).add(BigDecimal.valueOf(v2))).setScale(scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
}
/**
* 提供精确的减法运算
* @param v1
* @param v2
* @param scale :保留精度
* @return 两个参数的差
*/
public static double subtract(double v1, double v2,int scale)
{
return (BigDecimal.valueOf(v1).subtract(BigDecimal.valueOf(v2))).setScale(scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
}
/**提供金额乘法计算,用于金额与产品相乘,很少有连续相乘,所以只写一个
* @param v1
* @param v2
* @return
*/
public static double multiply(double v1,double v2)
{
return multiply(v1, v2, 2, BigDecimal.ROUND_HALF_UP);
}
/**提供金额加法计算,金额保留2位小数
* @param v1
* @param v2(可变参)
* @return
*/
public static double add(double v1,double... v2)
{
BigDecimal b1=BigDecimal.valueOf(v1);
for (double d : v2) {
b1=b1.add(BigDecimal.valueOf(d)).setScale(2, BigDecimal.ROUND_HALF_UP);
}
return b1.doubleValue();
}
/**提供产品加法计算,产品保留4位小数
* @param v1
* @param v2(可变参)
* @return
*/
public static double addProduct(double v1,double... v2)
{
BigDecimal b1=BigDecimal.valueOf(v1);
for (double d : v2) {
b1=b1.add(BigDecimal.valueOf(d)).setScale(4, BigDecimal.ROUND_HALF_UP);
}
return b1.doubleValue();
}