加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

BigDecimal

发布时间:2020-12-15 05:28:08 所属栏目:Java 来源:网络整理
导读:https://www.jianshu.com/p/2947868d76eb 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。 1、构建BigDecimal BigDecimal BigDecimal ( double d); //不允许使用,精度不能保证 BigDecimal BigDecimal (String s); //常用,推荐使用 stat
https://www.jianshu.com/p/2947868d76eb
大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

1、构建BigDecimal

BigDecimal BigDecimal(double d); //不允许使用,精度不能保证 BigDecimal BigDecimal(String s); //常用,推荐使用 static BigDecimal valueOf(double d); //常用,推荐使用 

2、方法

方法 描叙
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象
toString() 将BigDecimal对象的数值转换成字符串
doubleValue() 将BigDecimal对象中的值以双精度数返回
floatValue() 将BigDecimal对象中的值以单精度数返回
longValue() 将BigDecimal对象中的值以长整数返回
intValue() 将BigDecimal对象中的值以整数返回。
  @Test
    private void test(){
        BigDecimal a = new BigDecimal(100);
        BigDecimal b = new BigDecimal(1000);
        BigDecimal c = new BigDecimal(100);
        BigDecimal d = new BigDecimal(-100);
        BigDecimal e = new BigDecimal(0);
        

        //a,b,c相加
        BigDecimal add = a.add(b).add(c);
        System.out.println(add);

        //a,b相减
        BigDecimal subtract = a.subtract(b);
        System.out.println(subtract);

        //a,b相乘
        BigDecimal multiply = a.multiply(b);
        System.out.println(multiply);

        //b,a相除
        BigDecimal divide = b.divide(a);
        System.out.println(divide);

        //用signum函数判断数字是大于0,等于0,小于0
        int signumA = a.signum();
        System.out.println(String.format("%s,signum值为%s",a,signumA));
        int signumD = d.signum();
        System.out.println(String.format("%s,signum值为%s",d,signumD));
        int signumE = e.signum();
        System.out.println(String.format("%s,signum值为%s",e,signumE));

    }

?

1200
-900
100000
10
100,signum值为1
-100,signum值为-1
0,signum值为0

?

?

?

?

3、格式化和四舍五入

// 格式化:保留2为小数 DecimalFormat df = new DecimalFormat("#.##"); // 四舍五入,默认五舍六入 df.setRoundingMode(RoundingMode.HALF_UP); 

4、格式化
DecimalFormat 解析:

符号 位置 描叙
0 数字 阿拉伯数字,如果不存在则显示0
# 数字 阿拉伯数字,如果不存在不显示0
. 数字 小数分隔符或货币小数分隔符
, 数字 分组分隔符
E 数字 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。
- 数字 负号
; 子模式边界 分隔正数和负数子模式
% 前缀或后缀 乘以 100 并显示为百分数
u2030 前缀或后缀 乘以 1000 并显示为千分数
¤(u00A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。
前缀或后缀 用于在前缀或或后缀中为特殊字符加引号,例如 "‘#‘#"将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o‘‘clock"。

5、舍入模式介绍

  • RoundingMode.CEILNG:向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.UP;如果结果为负,则舍入行为类似于 RoundingMode.DOWN
    如下:
5.5 => 6 1.1 => 2 -1.0 => -1 -2.5 => -2 
  • RoundingMode.DOWN:向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值
    如下:
5.5 => 5 1.1 => 1 -1.0 => -1 -1.6 => -1 
  • RoundingMode.FLOOR:向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于 RoundingMode.UP
    注意:此舍入模式始终不会增加计算值
    如下:
5.5 => 5 2.3 => 2 1.0 => 1 -1.1 => -2 -2.5 => -3 
  • RoundingMode.HALF_DOWN :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN;
    五舍六入
    如下:
2.5 => 2 1.6 => 2 -1.1 => -1 -1.6 => -2 -2.5 => -2 
  • RoundingMode.HALF_EVEN :向 最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍 入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略
    如下:
5.5 => 6 2.5 => 2 1.1 => 1 -1.0 => -1 -1.6 => -2 -2.5 => -2 
  • RoundingMode.HALF_UP :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN
    注意:此舍入模式就是通常学校里讲的四舍五入
    如下:
2.5 => 3 1.1 => 1 -1.1 => -1 -1.6 => -2 
  • RoundingMode.UNNECESSARY :用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException
    如下:
1.5 => 抛出 ArithmeticException 1.1 => 抛出 ArithmeticException 1.0 => 1 -1.1 =>抛出 ArithmeticException -1.6 => 抛出 ArithmeticException 
  • RoundingMode.UP :远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值
    如下:
5.5 => 6 1.1 => 2 -1.1 => -2 -1.6 => -2 
问题
  1. BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)

解决方法:给divide设置精确的小数点

?

?

作者:九都散人链接:https://www.jianshu.com/p/2947868d76eb来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读