Java – 常用API – BigDecimal 精度小数
简介
在我们日常使用中,所有的数值都是用二进制来进行保存的,而小数是一个比较麻烦的问题。在计算机的世界中,整数的表示,中以 2 的 根数次方决定的,且第一个根数从0开始,如下:
而小数的计算就相对比较复杂,小数部分使用 2 的 负根数次方决定的,且第一个根数从-1开始的,如下
在一些比较特殊的小数中,使用这种方式去表达会需要使用的字节数已超出了 double 可存储的容量,系统会自动省略超出部分,使得小数精度出现误差,这在我们一些日常软件开发中可能并不影响,但在一些金融方面的开发和高精度生产开发上,就影响非常大了,Java给我们提供了一种高精度小数计算的类 BigDecimal。
BigDecimal
主要构造方法
BigDecimal( double val )
Java 并不推荐使用 double 数值传入构造的方法,因为这个构造方法依然不精确。
BigDecimal( String val )
Java 推荐使用的方法,该方法传入表达小数的字符串,能精确存储。
BigDecimal.valueOf( double val )
平时我们使用中,也可以通过静态方法创建小数,传入 double 值可生成精确小数。
BigDecimal( String val ) 和 BigDecimal.valueOf( double val ) 的区别
1.BigDecimal.valueOf( double val ) 仅可传入 double 的值,如果小数值大于 double ,建议使用 BigDecimal( String val ) 创建。
2.BigDecimal.valueOf( double val ) 底层提供了预生成 0~10 的实例对象,在需要创建 0~10 的整数时,底层会复用预生成对象而不会创建新的对象。
BigDecimal 计算方法
BigDecimal add(BigDecimal val) => 相加
BigDecimal subtract(BigDecimal val) => 相减
BigDecimal multiply(BigDecimal val) => 相乘
BigDecimal divide(BigDecimal val) => 相除,除不尽会报异常
BigDecimal divide(BigDecimal val,保留尾位数,舍弃模式) => 相除不尽时的处理
保留尾位数:scale 保留小数位后几位
舍弃模式:
RoundingMode.HALF_UP : 四舍五入,如果是0.5,会进一
RoundingMode.HALF_DOWN : 向最近数字方向舍入,如果是0.5,会舍掉
RoundingMode.CEILING : 向正方向舍入
RoundingMode.DOWN : 向 0 方舍入
RoundingMode.FLOOR : 向负无限大方向舍入
RoundingMode.UP : 远离 0 方向舍入
RoundingMode.HALF_EVEN : 向最接近数字方向舍入,如果相邻数字距离相等,则向相邻偶数舍入
RoundingMode.UNNECESSARY : 用于断言请求的操作具有精确结果的舍入
详情可在 JDK 文档中看案例。
共有 0 条评论