• Java 使用BigDecimal类处理高精度计算


    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作啦!

    (一)BigDecimal类的常用的几个构造方法

    • BigDecimal(int):将int表示形式转换为BigDecimal对象
    • BigDecimal(String) :将字符串表示形式转换为BigDecimal对象
    • BigDecimal(double):将double表示形式转换为BigDecimal对象

    (二)BigDecimal类的常用方法

    • add(BigDecimal):BigDecimal对象中的值相加,返回BigDecimal对象
    • subtract(BigDecimal):BigDecimal对象中的值相减,返回BigDecimal对象
    • multiply(BigDecimal):BigDecimal对象中的值相乘,返回BigDecimal对象
    • divide(BigDecimal):BigDecimal对象中的值相除,返回BigDecimal对象
    • toString():将BigDecimal对象中的值转换成字符串
    • doubleValue():将BigDecimal对象中的值转换成双精度数
    • floatValue():将BigDecimal对象中的值转换成单精度数
    • longValue():将BigDecimal对象中的值转换成长整数
    • intValue():将BigDecimal对象中的值转换成整数
    • 下面分享java代码,以作参考

    •  1 Java代码 复制代码 收藏代码
       2 import java.math.BigDecimal;   
       3 /**  
       4 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
       5 * 确的浮点数运算,包括加减乘除和四舍五入。  
       6 */  
       7 public class Arith{ //默认除法运算精度   
       8 private static final int DEF_DIV_SCALE = 10; //这个类不能实例化   
       9 private Arith(){   
      10 }   
      11 /**  
      12 * 提供精确的加法运算。  
      13 * @param v1 被加数  
      14 * @param v2 加数  
      15 * @return 两个参数的和  
      16 */  
      17 public static double add(double v1,double v2){   
      18 BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      19 BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      20 return b1.add(b2).doubleValue();   
      21 }   
      22 /**  
      23 * 提供精确的减法运算。  
      24 * @param v1 被减数  
      25 * @param v2 减数  
      26 * @return 两个参数的差  
      27 */  
      28 public static double sub(double v1,double v2){   
      29 BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      30 BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      31 return b1.subtract(b2).doubleValue();   
      32 }   
      33 /**  
      34 * 提供精确的乘法运算。  
      35 * @param v1 被乘数  
      36 * @param v2 乘数  
      37 * @return 两个参数的积  
      38 */  
      39 public static double mul(double v1,double v2){   
      40 BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      41 BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      42 return b1.multiply(b2).doubleValue();   
      43 }   
      44 /**  
      45 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
      46 * 小数点以后10位,以后的数字四舍五入。  
      47 * @param v1 被除数  
      48 * @param v2 除数  
      49 * @return 两个参数的商  
      50 */  
      51 public static double div(double v1,double v2){   
      52 return div(v1,v2,DEF_DIV_SCALE);   
      53 }   
      54 /**  
      55 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
      56 * 定精度,以后的数字四舍五入。  
      57 * @param v1 被除数  
      58 * @param v2 除数  
      59 * @param scale 表示表示需要精确到小数点以后几位。  
      60 * @return 两个参数的商  
      61 */  
      62 public static double div(double v1,double v2,int scale){   
      63 if(scale<0){   
      64 throw new IllegalArgumentException(   
      65 "The scale must be a positive integer or zero");   
      66 }   
      67 BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      68 BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      69 return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
      70 }   
      71 /**  
      72 * 提供精确的小数位四舍五入处理。  
      73 * @param v 需要四舍五入的数字  
      74 * @param scale 小数点后保留几位  
      75 * @return 四舍五入后的结果  
      76 */  
      77 public static double round(double v,int scale){   
      78 if(scale<0){   
      79 throw new IllegalArgumentException("The scale must be a positive integer or zero");   
      80 }   
      81 BigDecimal b = new BigDecimal(Double.toString(v));   
      82 BigDecimal one = new BigDecimal("1");   
      83 return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
      84 }   
      85 };  

      那么,BigDecimal 怎么转换成int或者Long

    • 如下:

      BigDecimal a=new BigDecimal(12.88);
      int b=a.intValue(); 
      System.out.println(b);//b=12;
      

        

    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    20.12.2 leetcode7
    20.12.1 leetcode34
    20.11.30 leetcode767
    20.11.29 leetcode976
    Codeforces632E 选择/小偷与商店 背包DP
    魔法少女 DP NG放的水
    逆反的01串 模拟 NG放的水
    最大数maxnumber bzoj1012 JSOI2008 单调队列
    组合数问题 vijos2006 NOIP2016 D2T1 杨辉三角 排列组合 前缀和
    信息传递 vijos1979 NOIP2015D1T2 强连通分量 tarjan模版题
  • 原文地址:https://www.cnblogs.com/shenwen/p/8423286.html
Copyright © 2020-2023  润新知