zoukankan      html  css  js  c++  java
  • Java中BigDecimal类的常用方法

    1.简介

    BigDecimal类位于java.math.BigDecimal包下。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。

    对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

    2.BigDecimal类常用方法

    2.1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据。

    2.2.BigDecimal(double val):构造方法,将double类型转换成BigDecimal类型数据。

    2.3.BigDecimal(int val):构造方法,将int类型转换成BigDecimal类型数据。

    2.4.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。

    2.5.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。

    2.6.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。

    2.7.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。

    2.8.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。

    2.9.BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值。

    2.10.BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值。

    2.11.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。

    2.12.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。

    代码:

    BigDecimal  a=new BigDecimal ("4.5");
            BigDecimal  b=new BigDecimal ("1.5");
            BigDecimal  c=new BigDecimal ("-10.5");
     
            BigDecimal  add_result=a.add(b);
            BigDecimal  subtract_result=a.subtract(b);
            BigDecimal  multiply_result=a.multiply(b);
            BigDecimal  divide_result=a.divide(b);
            BigDecimal  remainder_result=a.remainder(b);
            BigDecimal  max_result=a.max(b);
            BigDecimal  min_result=a.min(b);
            BigDecimal  abs_result=c.abs();
            BigDecimal  negate_result=a.negate();
     
            Log.d("TAG","4.5+1.5="+add_result);
            Log.d("TAG","4.5-1.5="+subtract_result);
            Log.d("TAG","4.5*1.5="+multiply_result);
            Log.d("TAG","4.5/1.5="+divide_result);
            Log.d("TAG","4.5/1.5余数="+remainder_result);
            Log.d("TAG","4.5和1.5最大数="+max_result);
            Log.d("TAG","4.5和1.5最小数="+min_result);
            Log.d("TAG","-10.5的绝对值="+abs_result);
            Log.d("TAG","4.5的相反数="+negate_result);
    

    结果:

    4.5+1.5=6.0
    4.5-1.5=3.0
    4.5*1.5=6.75
    4.5/1.5=3
    4.5/1.5余数=0.0
    4.5和1.5最大数=4.5
    4.5和1.5最小数=1.5
    -10.5的绝对值=10.5
    4.5的相反数=-4.5
    这里有一点需要注意的是除法运算divide。

    BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。

    其实divide有三个参数的方法

    BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

    第一参数表示除数。

    第二个参数表示小数点后保留位数。

    第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。

    舍入模式有下面这几种:

    ROUND_CEILING //向正无穷方向舍入

    ROUND_DOWN //向零方向舍入

    ROUND_FLOOR //向负无穷方向舍入

    ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

    ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位 数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

    ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55 保留一位小数结果为1.6

    ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式

    ROUND_UP //向远离0的方向舍入

    代码:

    BigDecimal a=new BigDecimal("4.5");
            BigDecimal b=new BigDecimal("1.5");
            BigDecimal c=new BigDecimal("2");
     
            BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);
            BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);
            Log.d("TAG","4.5/1.5="+result1);
            Log.d("TAG","4.5/2="+result2);
    

    结果:

    4.5/1.5=3.00
    4.5/2=2.25

    3.BigDecimal 小数点处理

    需求:计算结果保留三位小数。

    代码:

     /**
             * 方式1
             * 0.000:三位小数 同理 0.00:两位小数 依次类推...
             * */
     
            double a=3.154215;
            DecimalFormat myformat=new java.text.DecimalFormat("0.000");
            String result1 = myformat.format(a);
            Log.d("TAG",a+"保留三位小数:"+result1);
     
            /**
             * 方式2
             * #.000:三位小数 同理 #.00:两位小数
             * */
     
            double b=3.256321;
            DecimalFormat   df=new DecimalFormat("#.000");
            String result2=df.format(b);
            Log.d("TAG",b+"保留三位小数:"+result2);
     
            /**
             * BigDecimal类操作保留几位小数
             * */
     
            double   c=3.558525;
            BigDecimal   bigDecimal=new   BigDecimal(c);
            double result3=bigDecimal.setScale(3,   BigDecimal.ROUND_HALF_UP).doubleValue();
            Log.d("TAG",c+"保留三位小数并四舍五入:"+result3);
    

    结果:

    3.154215保留三位小数:3.154
    3.256321保留三位小数:3.256
    3.558525保留三位小数并四舍五入:3.559

    4.总结:

    (1)商业计算使用BigDecimal。

    (2)尽量使用参数类型为String的构造函数。

    (3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078198.html
Copyright © 2011-2022 走看看