zoukankan      html  css  js  c++  java
  • BigDecimal 的用法

    BigDecimal的用法

    import org.junit.Test;
    
    import java.math.BigDecimal;
    import java.text.NumberFormat;
    
    import static java.math.BigDecimal.*;
    
    /**
     * 对BigDecimal的所有的构造方法和使用方法进行测试
     * 常见的构造方法
     * BigDecimal(int)       创建一个具有参数所指定整数值的对象。
     * BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
     * BigDecimal(long)    创建一个具有参数所指定长整数值的对象。
     * BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
     * <p>
     * 公共方法
     * add(BigDecimal)          BigDecimal对象中的值相加,然后返回这个对象。
     * subtract(BigDecimal)     BigDecimal对象中的值相减,然后返回这个对象。
     * multiply(BigDecimal)    BigDecimal对象中的值相乘,然后返回这个对象。
     * divide(BigDecimal)      BigDecimal对象中的值相除,然后返回这个对象。
     * toString()                将BigDecimal对象的数值转换成字符串。
     * doubleValue()          将BigDecimal对象中的值以双精度数返回。
     * floatValue()             将BigDecimal对象中的值以单精度数返回。
     * longValue()             将BigDecimal对象中的值以长整数返回。
     * intValue()               将BigDecimal对象中的值以整数返回
     * <p>
     * 计算方法
     * public BigDecimal add(BigDecimal value); //加法
     * public BigDecimal subtract(BigDecimal value); //减法
     * public BigDecimal multiply(BigDecimal value); //乘法
     * public BigDecimal divide(BigDecimal value); //除法
     * <p>
     * <p>
     * 格式化:
     * 由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,
     * 可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制
     */
    public class BigDecimalTest extends JavaDemoApplicationTests {
    
    
    
        @Test
        public void operationTest() {
            BigDecimal a = new BigDecimal("4.5");
            BigDecimal b = new BigDecimal("1.5");
    
            System.out.println("a + b =" + a.add(b));  //加法
            System.out.println("a - b =" + a.subtract(b));  //减法
            System.out.println("a * b =" + a.multiply(b));  //乘法
            System.out.println("a / b =" + a.divide(b));  //除法
    
        }
    
    
        @Test
        public void testConstruction() {
            //测试构造方法
            //参数为int
            BigDecimal bigDecimal = new BigDecimal(2);
            double k = 2.3;
            BigDecimal bDouble = new BigDecimal(k);
            //使用double作为参数,得到的结果会有损失,可以写成这样Double.toString(k)
            BigDecimal bdouble = new BigDecimal(Double.toString(k));
            //参数为String
            BigDecimal bString = new BigDecimal("2.3");
    
            System.out.println("bigDecimal=" + bigDecimal);
            System.out.println("bDouble=" + bDouble);
            System.out.println("bdouble=" + bdouble);
            System.out.println("bString=" + bString);
    
        }
    
    
        @Test
        public void divideTest() {
            BigDecimal a = new BigDecimal("8");
            BigDecimal b = new BigDecimal("3");
            // 除法的宁外一个方法,里面是3个参数,第一个是除数类型是bigdecimal,第二个参数是保留小数点的位数,第三个参数是你选择的进舍的规则
            //保留两位小数,如果两位小数后面还有值向前进位
            System.out.println(a.divide(b, 0, ROUND_CEILING));
            System.out.println(a.divide(b, 2, ROUND_UP));
        }
    
        @Test
        public void formatTest() {
            NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
            NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用
            percent.setMaximumFractionDigits(3); //百分比小数点最多3位
    
            BigDecimal loanAmount = new BigDecimal("15000.48"); //贷款金额
            BigDecimal interestRate = new BigDecimal("0.008"); //利率
            BigDecimal interest = loanAmount.multiply(interestRate); //相乘
    
            System.out.println("贷款金额:	" + currency.format(loanAmount));
            System.out.println("利率:	" + percent.format(interestRate));
            System.out.println("利息:	" + currency.format(interest));
    
        }
    
    
        @Test
        public void divideTests() {
            //绝对值的使用
            System.out.println(new BigDecimal(-1));
            System.out.println(new BigDecimal(-1).abs());
        }
    
    
    }
    
    
    

    BigDecimal提供了8种舍入方式
    1、ROUND_UP:舍入远离零的舍入模式。在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
    注意,此舍入模式始终不会减少计算值的大小。

    2、ROUND_DOWN:接近零的舍入模式。在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
    注意,此舍入模式始终不会增加计算值的大小。

    3、ROUND_CEILING:接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。
    注意,此舍入模式始终不会减少计算值。

    4、ROUND_FLOOR:接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。
    注意,此舍入模式始终不会增加计算值。

    5、ROUND_HALF_UP:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
    如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
    注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

    6、ROUND_HALF_DOWN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
    如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

    7、ROUND_HALF_EVEN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
    如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
    如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
    注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
    此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。如果前一位为奇数,则入位,否则舍去。以下例子为保留小数点1位,那么这种舍入方式下的结果。
    1.15>1.2 1.25>1.2

    8、ROUND_UNNECESSARY:断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

  • 相关阅读:
    讨喜的隔离可变性(十三)角色的特性
    讨喜的隔离可变性(十三)角色的特性
    解锁不可见索引新特性,处理ORA-01555故障
    django url 正则匹配
    django 往session写信息
    django 判断用户是否登录
    django 管理session
    Python爬虫入门教程 1-100 CentOS环境安装
    django session管理
    案发现场:被注入的软件及 ORA-600 16703 灾难的恢复
  • 原文地址:https://www.cnblogs.com/java-hardly-road/p/11102543.html
Copyright © 2011-2022 走看看