BigDecimal相关总结

BigDecimal相关总结

package bigDecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class Test {
    public static void main(String[] args) {
        // 构造方法
        System.out.println("=========构造方法=========");
        System.out.println(new BigDecimal(1));
        System.out.println(new BigDecimal("1"));
        System.out.println(new BigDecimal("1.2"));
        // 不推荐使用
        System.out.println(new BigDecimal(1.2));
        System.out.println(BigDecimal.valueOf(1.2));
        System.out.println(new BigDecimal(1L));

        // 格式化
        System.out.println("=========格式化=========");
        // 货币格式化
        NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.GERMAN);
        System.out.println(currencyInstance.format(new BigDecimal("128000000.00")));
        // 百分数格式化
        NumberFormat percentInstance = NumberFormat.getPercentInstance();
        percentInstance.setMaximumFractionDigits(8);
        System.out.println(percentInstance.format(new BigDecimal("0.000008")));
        // 数据位数格式化
        DecimalFormat format1 = new DecimalFormat("000.00");
        System.out.println(format1.format(new BigDecimal("36.2356")));
        DecimalFormat format2 = new DecimalFormat("###.##");
        System.out.println(format2.format(new BigDecimal("36.2356")));

        // 精度
        BigDecimal p = new BigDecimal("3.335");
        // 向0靠拢
        System.out.println("=========RoundingMode.DOWN向0靠拢=========");
        System.out.println(p.setScale(2, RoundingMode.DOWN));
        System.out.println(p.negate().setScale(2, RoundingMode.DOWN));
        // 远离0
        System.out.println("=========BigDecimal.ROUND_UP远离0=========");
        System.out.println(p.setScale(2, BigDecimal.ROUND_UP));
        System.out.println(p.negate().setScale(2, BigDecimal.ROUND_UP));
        // 靠近正无穷
        System.out.println("=========RoundingMode.CEILING靠近正无穷=========");
        System.out.println(p.setScale(2, RoundingMode.CEILING));
        System.out.println(p.negate().setScale(2, RoundingMode.CEILING));
        // 靠近负无穷
        System.out.println("=========BigDecimal.ROUND_FLOOR靠近负无穷=========");
        System.out.println(p.setScale(2, BigDecimal.ROUND_FLOOR));
        System.out.println(p.negate().setScale(2, BigDecimal.ROUND_FLOOR));
        // 四舍五入
        System.out.println("=========BigDecimal.ROUND_HALF_UP四舍五入=========");
        System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_UP));
        // 五舍六入
        System.out.println("=========BigDecimal.ROUND_FLOOR五舍六入=========");
        System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_DOWN));
        System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_DOWN));
        // 银行家舍入法,四舍六入,五看情况(靠近偶数)
        System.out.println("=========BigDecimal.ROUND_FLOOR银行家舍入法=========");
        System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_EVEN));
        System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_EVEN));
        // 断言不需要舍入,否则报错
        System.out.println("=========BigDecimal.ROUND_UNNECESSARY断言不需要舍入=========");
        System.out.println(p.setScale(3, BigDecimal.ROUND_UNNECESSARY));
        try {
            p.setScale(2, BigDecimal.ROUND_UNNECESSARY);
        } catch (Exception e) {
            // java.lang.ArithmeticException: Rounding necessary
            System.out.println(e.toString());
        }

        // 运算
        System.out.println("=========运算=========");
        BigDecimal a = new BigDecimal("10");
        BigDecimal b = new BigDecimal("3");
        // 加
        System.out.println(a + " + " + b + " = " + a.add(b));
        System.out.println("经过计算a的值不改变,a = " + a);
        // 减
        System.out.println(a + " - " + b + " = " + a.subtract(b));
        // 乘
        System.out.println(a + " × " + b + " = " + a.multiply(b));
        // 除
        System.out.println(a + " ÷ " + b + " = " + a.divide(b, 2, RoundingMode.HALF_UP));
        // 余数
        System.out.println(a + " ÷ " + b + " 余 " + a.remainder(b));
        // 商和余数
        System.out.println(a + " ÷ " + b + " = " + a.divideAndRemainder(b)[0] + " ... " +a.divideAndRemainder(b)[1]);
        // 幂运算
        System.out.println(new BigDecimal("2").pow(10));
        System.out.println(new BigDecimal("2.0").pow(10));
        System.out.println(new BigDecimal("2.1").pow(10));
        // 位数
        System.out.println("3.33的位数: " +a.divide(b, 2, RoundingMode.HALF_UP).precision());
        // 小数位数
        System.out.println("3.33的小数位数: " + a.divide(b, 2, RoundingMode.HALF_UP).scale());
        // 正负号
        System.out.println("4876的符号是:" + new BigDecimal("4876").signum());
        System.out.println("-4876的符号是:" +new BigDecimal("-4876").signum());
        // 比较大小
        System.out.println("a > b: " + a.compareTo(b));
        BigDecimal samllA = new BigDecimal("0.000000000001");
        BigDecimal smallB = new BigDecimal("0.0000000000002");
        System.out.println("samllA > smallB: " + samllA.compareTo(smallB));
        // 相反数
        System.out.println(a.negate());
        // 绝对值
        System.out.println(new BigDecimal("-96").abs());
        // 最大值
        System.out.println("最大值:" + a.max(b).max(new BigDecimal("100.2")));
        // 最小值
        System.out.println("最小值:" + a.min(b));
        // 判断是否相等
        System.out.println(new BigDecimal("1236.5").equals(new BigDecimal("1236.5")));
        System.out.println(new BigDecimal("1236.5").equals(new BigDecimal("1236.8")));
        // hash值
        System.out.println(new BigDecimal("73246598").hashCode());
        // 移动小数点,相当于缩放10的倍数
        System.out.println("88小数点左移3位:" + new BigDecimal("88").movePointLeft(3));
        System.out.println("88小数点右移3位:" + new BigDecimal("88").movePointRight(3));
        System.out.println(new BigDecimal("22").plus().plus());
        // 刻度值,最小单位
        System.out.println("156.963的刻度值:" + new BigDecimal("156.963").ulp());
        System.out.println("1560的刻度值:" + new BigDecimal("1560").ulp());

        // 结果转换
        System.out.println("=========结果转换=========");
        System.out.println(a.intValue());
        System.out.println(a.doubleValue());
        System.out.println(a.floatValue());
        System.out.println(a.longValue());
        System.out.println(a.toString());

        // 基本常量
        System.out.println("=========基本常量=========");
        System.out.println("BigDecimal.ZERO = " + BigDecimal.ZERO);
        System.out.println("BigDecimal.ONE = " + BigDecimal.ONE);
        System.out.println("BigDecimal.TEN = " + BigDecimal.TEN);

        /**
         *   总结:
         *  (1)商业计算使用BigDecimal。
         *   (2)尽量使用参数类型为String的构造函数。
         *   (3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
         *   (4)我们往往容易忽略JDK底层的一些实现细节,导致出现错误,需要多加注意。
         */
    }
}

控制台输出

=========构造方法=========
1
1
1.2
1.1999999999999999555910790149937383830547332763671875
1.2
1
=========格式化=========
¤ 128.000.000,00
0.0008%
036.24
36.24
=========RoundingMode.DOWN向0靠拢=========
3.33
-3.33
=========BigDecimal.ROUND_UP远离0=========
3.34
-3.34
=========RoundingMode.CEILING靠近正无穷=========
3.34
-3.33
=========BigDecimal.ROUND_FLOOR靠近负无穷=========
3.33
-3.34
=========BigDecimal.ROUND_HALF_UP四舍五入=========
3.34
-3.34
=========BigDecimal.ROUND_FLOOR五舍六入=========
3.33
-3.33
=========BigDecimal.ROUND_FLOOR银行家舍入法=========
3.34
-3.34
=========BigDecimal.ROUND_UNNECESSARY断言不需要舍入=========
3.335
java.lang.ArithmeticException: Rounding necessary
=========运算=========
10 + 3 = 13
经过计算a的值不改变,a = 10
10 - 3 = 7
10 × 3 = 30
10 ÷ 3 = 3.33
10 ÷ 31
10 ÷ 3 = 3 ... 1
1024
1024.0000000000
1667.9880978201
3.33的位数: 3
3.33的小数位数: 2
4876的符号是:1
-4876的符号是:-1
a > b: 1
samllA > smallB: 1
-10
96
最大值:100.2
最小值:3
true
false
-2024322758
88小数点左移3位:0.088
88小数点右移3位:88000
22
156.963的刻度值:0.001
1560的刻度值:1
=========结果转换=========
10
10.0
10.0
10
10
=========基本常量=========
BigDecimal.ZERO = 0
BigDecimal.ONE = 1
BigDecimal.TEN = 10

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值