zoukankan      html  css  js  c++  java
  • BigDecimal史上最全详解

    本篇主要介绍BigDecimal类型基本操作+保留精度+取整+取余+比较大小+类型转换

    基本操作加,减,乘,除

    public class BigDecimalTest {
        public static void main(String[] args) {
            BigDecimal bignum1 = new BigDecimal("7.25");
            BigDecimal bignum2 = new BigDecimal("5.00");
            BigDecimal bignum3 = null;
    
            //加法
            bignum3 = bignum1.add(bignum2);
            System.out.println("和  是:" + bignum3);
    
            //减法
            bignum3 = bignum1.subtract(bignum2);
            System.out.println("差  是:" + bignum3);
    
            //乘法 
            bignum3 = bignum1.multiply(bignum2);
            System.out.println("积  是:" + bignum3);
    
            //除法
            bignum3 = bignum1.divide(bignum2);
            System.out.println("商  是:" + bignum3);
        }
    }

    运行结果:

      和 是:12.25
      差 是:2.25
      积 是:36.2500
      商 是:1.45

    保留精度及取整(保留0位小数)

      scale为小数位数;roundingMode为小数模式;

      除法保留50位小数:bignum1.divide(bignum2,50,BigDecimal.ROUND_UP);

      乘法保留一位小数: bignum1.multiply(bignum2).setScale(1,BigDecimal.ROUND_HALF_UP);

      乘法运行结果:积 是:36.3

      问题来了,我们不设置精度时是36.2500 保留一位小数时是36.3,这是为什么呢?原来和.ROUND_HALF_UP有关!

    不保留小数为例取整,各个roundingMode详解如下:

    ROUND_UP:正数时,舍弃小数后(整数部分)加1,比如12.49结果为13。负数时,舍弃小数后(整数部分)减去1,-12.49结果为 -13

    ROUND_DOWN:直接舍弃小数

    ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (取附近较大的整数)

    ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(取附近较小的整数)

    ROUND_HALF_UP:四舍五入(取更近的整数)

    ROUND_HALF_DOWN:同ROUND_HALF_UP 差别仅在于0.5时会向下取整

    ROUND_HALF_EVEN:取最近的偶数

    ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常

      看到这里我们可以推理在保留小数取整的时候,保留一位小数时36.25因为四舍五入到36.3,如果用ROUND_HALF_DOWN那结果就是36.2,如果用ROUND_UP那结果就是36.3,如果用ROUND_DOWN那结果就是36.2

    取余(divideAndRemainder方法)

    public BigDecimal[] divideAndRemainder(BigDecimal divisor);
    

    该方法接收另一个BigDecimal 对象作为参数,该参数即为除数,返回一个BigDecimal数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数。使用案例如下:

    package net.csdn.test;
     
    import java.math.BigDecimal;
     
    public class TestBigDecimal {
        public static void main(String[] args) {
            BigDecimal amt = new BigDecimal(14);
            BigDecimal[] results = amt.divideAndRemainder(BigDecimal.valueOf(5.00));
            System.out.println(results[0]);
            System.out.println(results[1]);
        }
    }
    

    运行程序分别输出商2,余数4.0,可以达到和基本数据类型%运算相同的效果。

    比较大小(compareTo)

      int a =baltotal.compareTo(hundred);  若a>0或a=1则baltotal大,a=0则baltotal等于参数,a<0或a=-1则baltotal小

      应用场景:电单车充电以电池电量百分之五为阶梯收费,百分之五收0.2元,百分之六收0.4元,这时需要判断取余后的余数

           是否大于0,int a =baltotal.compareTo(BigDecimal.ZERO);

    int与bigdecimal的相互转换

       int转bigdecimal

       BigDecimal number = new BigDecimal(0);
       int value=1;
       number=BigDecimal.valueOf((value);
    

      bigdecimal转int

    BigDecimal b=new BigDecimal(45.45);
    int a = b.intValue();
  • 相关阅读:
    eclipse里maven项目An error occurred while filtering resources解决办法
    python中分页使用
    es学习
    cmdb资产管理2
    saltstack安装使用
    Django Rest Framework
    免交互批量分发公钥的实现
    单链表复制早已难不到你,但若我们再加个指针...
    面试 16:栈的压入压出队列(剑指 Offer 第 22 题)
    面试 15:顺时针从外往里打印数字(剑指 Offer 第 20 题)
  • 原文地址:https://www.cnblogs.com/wffzk/p/15568555.html
Copyright © 2011-2022 走看看