BigDecimal总结

一、BigDecimal概述

BigDecimal是Java常用的API之一,位于java.math.BigDecimal包下,常用于需要精确计算数据的场景中,例如涉及到订单金额和银行账务数据等场景。

二、BigDecimal优缺点

相比较于单精度浮点型变量float和双精度浮点型变量double,BigDecimal有如下优点

优点:单精度浮点型变量float可以处理7位有效数,双精度浮点型变量double可以处理16位有效数,BigDecimal可以处理任意大小且精度完全准确的浮点数。

缺点:BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。

三、BigDecimal的常用方法

构造方法

3.1.1、BigDecimal(int)
创建一个具有参数所指定整数值的对象

3.1.2、BigDecimal(long)
创建一个具有参数所指定长整数值的对象

3.1.3、BigDecimal(String)
创建一个具有参数所指定以字符串表示的数值的对象

3.1.4、BigDecimal(double)
创建一个具有参数所指定双精度值的对象,不推荐使用
示例:

BigDecimal first = new BigDecimal("0.12");
BigDecimal second = new BigDecimal(0.12);

System.out.println("first is:" + first);
System.out.println("second is:" + second);
first is:0.12
second is:0.11999999999999999555910790149937383830547332763671875

原因:

入参类型为double类型的构造方法的结构有不可预知性,因为十进制的0.12无法十分准确的转化为计算机底层可以识别的二进制(浮点数的进制转化精度问题)。

其他常用方法

方法名描述
scale()获取小数点后的位数
stripTrailingZeros()将BigDecimal对象末尾的0去掉
add()加法
subtract()减法
multiply()乘法
divide()除法
remainder()模运算
compareTo()比较BigDecimal对象值的大小
doubleValue()将BigDecimal对象中的值转换成双精度数
floatValue()将BigDecimal对象中的值转换成单精度数
longValue()将BigDecimal对象中的值转换成长整数
intValue()将BigDecimal对象中的值转换成整数
toString()将BigDecimal对象中的值转换成字符串

示例

import java.math.BigDecimal;

public class LearnBigDecimal {
    public static void main(String[] args) {
        // BigDecimal的构造方法
        BigDecimal first = new BigDecimal("123.345");
        BigDecimal second = new BigDecimal("0.120");
        System.out.println("first:" + first);
        System.out.println("second:" + second);

        // scale():获取BigDecimal对象小数点后位数,返回值为负数表示这个数是个整数
        System.out.println("first小数点后位数:" + first.scale());
        System.out.println("second小数点后位数:" + second.scale());

        // 将second格式化为一个相等的,但去掉了末尾0的BigDecimal对象third
        BigDecimal third = second.stripTrailingZeros();
        System.out.println("third:" + third);

        // 加、减、乘
        System.out.println("first + second = " + first.add(second));
        System.out.println("first - second = " + first.subtract(second));
        System.out.println("first * second = " + first.multiply(second));

        // 除法存在无法除尽的情况,需要指定精度以及如何进行截断,否则抛异常:ArithmeticException
        BigDecimal divideValue = first.divide(second, 10, BigDecimal.ROUND_HALF_UP);
        System.out.println("first / second = " + divideValue);

        // 模运算
        BigDecimal remainderValue = first.remainder(second);
        System.out.println("first % second = " + remainderValue);

        // 四舍五入 0表示小数点后位数为0
        BigDecimal value1 = first.setScale(0, BigDecimal.ROUND_HALF_UP);
        System.out.println("first四舍五入后值为:" + value1);

        // 直接截断 2表示小数点后位数为2
        BigDecimal value2 = first.setScale(2, BigDecimal.ROUND_HALF_DOWN);
        System.out.println("first直接截断后值为:" + value2);

        // 使用compareTo()比较BigDecimal对象值的大小
        if (first.compareTo(second) > 0) {
            System.out.println("first > second");
        } else if (first.compareTo(second) == 0) {
            System.out.println("first = second");
        } else {
            System.out.println("first < second");
        }
    }
}

结果

first:123.345
second:0.120
first小数点后位数:3
second小数点后位数:3
third:0.12
first + second = 123.465
first - second = 123.225
first * second = 14.801400
first / second = 1027.8750000000
first % second = 0.105
first四舍五入后值为:123
first直接截断后值为:123.34
first > second

四、BigDecimal.setScale用法总结

注:进位在这里的解释是数字的绝对值进位

常量解释
BigDecimal.ROUND_DOWN直接截断
BigDecimal.ROUND_UP直接进位
BigDecimal.ROUND_HALF_UP四舍五入
BigDecimal.ROUND_HALF_DOWN五舍六入
BigDecimal.ROUND_CEILING天花板(向上),正数直接进位,负数直接截断
BigDecimal.ROUND_FLOOR地板(向下),正数直接截断,负数直接进位
BigDecimal.ROUND_HALF_EVEN如果舍弃部分左边的数字为偶数,则作 五舍六入;如果舍弃部分左边的数字为奇数,则作 四舍五入
import java.math.BigDecimal;

public class LearnBigDecimal {
    public static void main(String[] args) {
        // BigDecimal.ROUND_DOWN : 直接截断 2.22
        BigDecimal b = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_DOWN);

        // BigDecimal.ROUND_UP : 直接进位 2.23
        BigDecimal c = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_UP);
       

        // BigDecimal.ROUND_HALF_UP : 四舍五入 2.23
        BigDecimal d = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_UP);
        
        // BigDecimal.ROUND_HALF_DOWN : 五舍六入 2.23
        BigDecimal e = new BigDecimal("2.226").setScale(2, BigDecimal.ROUND_HALF_DOWN);

        // BigDecimal.ROUND_CEILING : 天花板(向上),正数直接进位,负数直接截断  2.23
        BigDecimal f = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_CEILING);

        // -2.22
        BigDecimal g = new BigDecimal("-2.225667").setScale(2, BigDecimal.ROUND_CEILING);
        
        // BigDecimal.ROUND_FLOOR : 地板(向下),正数直接截断,负数直接进位 2.22
        BigDecimal h = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_FLOOR);
        System.out.println(h);

        // -2.23
        BigDecimal i = new BigDecimal("-2.224667").setScale(2, BigDecimal.ROUND_FLOOR);
        System.out.println(i);
        
        BigDecimal j = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_EVEN);
        System.out.println(j);//2.22 如果舍弃部分左边的数字为偶数,则作   五舍六入

        BigDecimal k = new BigDecimal("2.215").setScale(2, BigDecimal.ROUND_HALF_EVEN);
        System.out.println(k);//2.22 如果舍弃部分左边的数字为奇数,则作   四舍五入
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值