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)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

  • 相关阅读:
    Behavior Targeting 技术研究
    LINQ的Distinct总结
    当为业务逻辑层(BLL,Service)提供基类之后,程序变得了更加面向对象了
    MVC中,查询以异步呈现,分页不用异步的解决方案
    基础才是重中之重——面向抽象编程(抽象类的多态性)
    基础才是重中之重——派生类集合与基类集合可以相互转换吗?
    让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能
    转发一个最新HEVCH.265码流分析软件
    PHP性能优化大全(整理)
    “灭”了国外的mini sql !
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078198.html
Copyright © 2011-2022 走看看