关于java 中double型数据的四舍五入与加减乘除

本文介绍Java中处理浮点数运算不精确及四舍五入时的问题和解决方案,包括使用BigDecimal类进行加减乘除运算的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. java中用DecimalFormat df = new DecimalFormat("#######0.00");进行四舍五入时,如果最后一位为5,则会直接舍掉,而不会入上去。如:12.515,得到得结果将是12.51。解决方法:   
  2. blic static double round(double v,int scale){   
  3.       if(scale<0){   
  4.           throw new IllegalArgumentException(   
  5.               "The scale must be a positive integer or zero");   
  6.       }   
  7.       BigDecimal b = new BigDecimal(Double.toString(v));   
  8.       BigDecimal one = new BigDecimal("1");   
  9.       return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
  10.   }   
  11.   java中的浮点数类型floatdouble不能进行运算,遇到有些数据得到的数据不准确。如:3.121-1=3.1209999999998。解决方法:   
  12. blic class Arith {   
  13.   private static final int DEF_DIV_SCALE = 10;   
  14.      
  15.   /**  
  16.    * 两个Double数相加  
  17.    * @param v1  
  18.    * @param v2  
  19.    * @return Double  
  20.    */  
  21.   public static Double add(Double v1,Double v2){   
  22.       BigDecimal b1 = new BigDecimal(v1.toString());   
  23.       BigDecimal b2 = new BigDecimal(v2.toString());   
  24.       return b1.add(b2).doubleValue();   
  25.   }   
  26.      
  27.   /**  
  28.    * 两个Double数相减  
  29.    * @param v1  
  30.    * @param v2  
  31.    * @return Double  
  32.    */  
  33.   public static Double sub(Double v1,Double v2){   
  34.       BigDecimal b1 = new BigDecimal(v1.toString());   
  35.       BigDecimal b2 = new BigDecimal(v2.toString());   
  36.       return b1.subtract(b2).doubleValue();   
  37.   }   
  38.      
  39.   /**  
  40.    * 两个Double数相乘  
  41.    * @param v1  
  42.    * @param v2  
  43.    * @return Double  
  44.    */  
  45.   public static Double mul(Double v1,Double v2){   
  46.       BigDecimal b1 = new BigDecimal(v1.toString());   
  47.       BigDecimal b2 = new BigDecimal(v2.toString());   
  48.       return b1.multiply(b2).doubleValue();   
  49.   }   
  50.      
  51.   /**  
  52.    * 两个Double数相除  
  53.    * @param v1  
  54.    * @param v2  
  55.    * @return Double  
  56.    */  
  57.   public static Double div(Double v1,Double v2){   
  58.       BigDecimal b1 = new BigDecimal(v1.toString());   
  59.       BigDecimal b2 = new BigDecimal(v2.toString());   
  60.       return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();   
  61.   }   
  62.      
  63.   /**  
  64.    * 两个Double数相除,并保留scale位小数  
  65.    * @param v1  
  66.    * @param v2  
  67.    * @param scale  
  68.    * @return Double  
  69.    */  
  70.   public static Double div(Double v1,Double v2,int scale){   
  71.       if(scale<0){   
  72.           throw new IllegalArgumentException(   
  73.           "The scale must be a positive integer or zero");   
  74.       }   
  75.       BigDecimal b1 = new BigDecimal(v1.toString());   
  76.       BigDecimal b2 = new BigDecimal(v2.toString());   
  77.       return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
  78.   }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值