java double 计算出错的问题

最近在做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();

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值