你知道的BigDecimal哪些事~

这里写自定义目录标题

  • 引言
  • 是什么 ?
  • 它为什么会出现?
  • 如何使用?
    • BigDecimal 构造方法
    • BigDecimal- 加减乘除运算
  • BigDecimal Round 模式 ?
  • 总结

引言

由于公司是跟金融行业相关的(钱包),哈哈宣传一下我们公司~ 所以必不可少使用到BigDecimal对象,以前使用过,但是只是偶尔可能使用,深度还有待提高,所以这次总结一下BigDecimal的使用.

是什么 ?

它是我们java.math包下的API,继承number实现comparable ,根据它所在的位置,我们可以大体定位他的作用,math下的包肯定加减乘除是ok的,它继承了number,那他和double,float有什么区别? 他们的相同点都是对数字进行操作,但是区别是什么? 它实现了compareable接口对数字比较完全可以使用,但是在使用的过程中需要避免踩一下坑,例如我,(此处留下苦笑表情包)

它为什么会出现?

java在浮点类型中提供了4为的float类型和8位的double类型, 他们都是对小数点进行操作,但是在java运行的时候会丢失精度问题,如果你的公司处于金融行业, 一定不要使用float or double , 亏大发~ ,

java提供BigDecimal对象来处理浮点数,用来针对于超过16位有效位数做精确的运算.当我们大体知道他为什么出现的时候,使用它的时候便顺手了~

如何使用?

BigDecimal 构造方法

BigDecimal 有 很多种构造方法, 我就不一一列举了,感兴趣的可以自己玩玩~ , 介绍一下比较常用的

 public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal(88.8);
        System.out.println(decimal);
    }

运行结果: 88.7999999999999971578290569595992565155029296875

如果我们的构造参数里面填的是String类型

public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal("88.8");
        System.out.println(decimal);
    }
运行结果: 88.8

为什么会是这个效果? 我们看一下源码是如何操作的? 具体我就不玩往下跟踪代码了,大体就是根据他的它的offset和len长度进行计算的.如果字符序列已经可用作字符数组,则使用此构造函数比将char数组转换为字符串并使用BigDecimal(String)构造函数更快在这里插入图片描述

BigDecimal- 加减乘除运算

       Double num1 = 88.8;
        Double num2 = 99.9;
        BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
        BigDecimal decimal2 = new BigDecimal(Double.toString(num2));
        //加
        System.out.println(decimal1.add(decimal2));
        //减
        System.out.println(decimal2.subtract(decimal1));
        //剩
        System.out.println(decimal1.multiply(decimal2));
        //除
        System.out.println(decimal2.divide(decimal1));

结果 : 
188.7
11.1
8871.12
1.125

BigDecimal Round 模式 ?

在看完BigDecimal的运算之后,你在心理有没有小疑问? 除法约等于如何做到? , 让我们一起揭开面纱~

//舍入模式从零开始。 始终在非零丢弃分数之前增加数字。 
public static final int ROUND_UP   
  Double num1 = 122.466;
  BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
  BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_UP);
  System.out.println(decimal.toString());      
运行结果: 122.5  

//舍入模式向零舍入。 不要在丢弃的分数之前递增数字(即截断)。 请注意,该舍入模式不会增加计算值的大小,其实就是直接省略多余的小数
public static final int ROUND_DOWN
  Double num1 = 122.466;
  BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
  BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_DOWN);
  System.out.println(decimal.toString()); 
运行结果:122.4  

// 如果与两个相邻数字的距离相等,则为上舍入的舍入模式
public static final int ROUND_HALF_UP
    Double num1 = 122.55;
    BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
    BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(decimal.toString());
运行结果: 122.6



//ROUND_HALF_DOWN 两个相邻数字的距离相等,则为向上舍入的舍入模式。如果是大于0.5,则去掉最后一个与ROUND_UP 相同
public static final int ROUND_HALF_DOWN
    Double num1 = 122.55;
    BigDecimal decimal1 = new BigDecimal(Double.toString(num1));
    BigDecimal decimal = decimal1.setScale(1, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(decimal.toString());
运行结果: 122.5

总结

好久不写博客,生疏了不少,csdn样式都变了,哈哈哈,下一篇就得等到下周给大家分享了,下周给大家分享阿里的代码规范, 顺便提醒自己代码规范问题, 写出一手漂亮的代码666, 此处留下笑脸~

你可能感兴趣的:(✿,Java篇)