Java BigDecimal 类的创建对象方法以及常用的加减乘除、设置精度方法

一、BigDecimal 类简介

  因为计算机无法精确表示浮点数,所以在进行数字运算时,如果有 double 或 float 类型的浮点数参与计算,容易出现计算不准确的情况。在一些对精度要求很高的系统中,需要使用 BigDecimal 类来进行精确运行。

二、创建 BigDecimal 对象的方式
2.1 使用构造方法创建对象

  使用构造器方法创建对象,有多种不同的入参,常见的方法如下:

  • BigDecimal(String val)
  • BigDecimal(double val) (备注:不推荐,容易丢精度)
2.2 使用静态方法创建对象

  BigDecimal 有多种静态方法可以创建对象,常见的几种方法如下所示:

  • public static BigDecimal valueOf(double val)
  • public static BigDecimal valueOf(long val)
  • public static BigDecimal valueOf(long unscaledVal, int scale)

  以上几种创建 BigDecimal 的 demo 如下所示。

	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("123.092");
        System.out.println(num1);
        // 123.092

        // 不推荐此种方法
        BigDecimal num2 = new BigDecimal(123.092);
        System.out.println(num2);
        // 123.0919999999999987494447850622236728668212890625

        BigDecimal num3 = BigDecimal.valueOf(1234.5678);
        System.out.println(num3);
        // 1234.5678

        long num4 = 1234;
        BigDecimal num5 = BigDecimal.valueOf(num4);
        System.out.println(num5);
        // 1234

        BigDecimal num6 = BigDecimal.valueOf(num4, 3);
        System.out.println(num6);
        // 1.234
    }
三、BigDecimal 类的常用方法

  BigDecimal 几种常见计算方法如下所示。

操作方法函数
加法public BigDecimal add(BigDecimal augend)
减法public BigDecimal subtract(BigDecimal subtrahend)
乘法public BigDecimal multiply(BigDecimal multiplicand)
除法(限定能除尽的情况,如果除不尽会抛出异常java.lang.ArithmeticException)public BigDecimal divide(BigDecimal divisor)
除法(可设置相除结果保留精度,无论是否可以除尽,都可以用该方法设置精度)public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
求余public BigDecimal remainder(BigDecimal divisor)
求相反数public BigDecimal negate()

  以上几种操作方法的 demo 如下所示。

	public static void main(String[] args) {
        BigDecimal bignum1 = new BigDecimal("10");
        BigDecimal bignum2 = new BigDecimal("2");
        BigDecimal bignum3;

        // 加法
        bignum3 = bignum1.add(bignum2);
        System.out.println("和是:" + bignum3);
        // 和是:12

        // 减法
        bignum3 = bignum1.subtract(bignum2);
        System.out.println("差是:" + bignum3);
        // 差是:8

        // 乘法
        bignum3 = bignum1.multiply(bignum2);
        System.out.println("积是:" + bignum3);
        // 积是:20

        // 除法(可除尽时)
        bignum3 = bignum1.divide(bignum2);
        System.out.println("商是:" + bignum3);
        // 商是:5

        // 除法(设置精度及舍入模式)
        BigDecimal a = new BigDecimal("10");
        BigDecimal b = new BigDecimal("3");
        BigDecimal c = a.divide(b, 3, RoundingMode.HALF_UP);
        System.out.println("商是:" + c);
        // 商是:3.333

        // 求余数
        BigDecimal d = new BigDecimal("5");
        BigDecimal e = new BigDecimal("3");
        System.out.println(d.remainder(e));
        // 2

        // 求余数
        BigDecimal f = new BigDecimal("5.5");
        BigDecimal g = new BigDecimal("3.1");
        System.out.println(f.remainder(g));
        // 2.4

        // 求相反数
        BigDecimal h = new BigDecimal("-5.4");
        BigDecimal i = h.negate();
        System.out.println(i);
        // 5.4
    }
四、设置精度(保留小数位)

  BigDecimal 有多种方法可以设置精度(即设置几位小数)。分述如下。

4.1 DecimalFormat 设置格式

  可以通过 DecimalFormat 设置保留的格式,demo 如下所示。如何编写 DecimalFormat,可以参考网上的介绍,此处不做介绍。

    public static void main(String[] args) {
        // 格式化两位有效数字(四舍五入)
        DecimalFormat df = new DecimalFormat("0.00");
        double num1 = 0.145926;
        System.out.println(df.format(num1));
        // 0.15
    }
4.2 BigDecimal setScale(int newScale) 方法设置精度

  可以调用 BigDecimal 的 setScale(int newScale) 方法来设置精度,其中传入参数即保留的小数位数。该方法要求请求的操作具有精确的结果,否则会抛出 ArithmeticException。

	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234");
        BigDecimal num2 = num1.setScale(1);
        System.out.println(num2);
        // 1234.0

        BigDecimal num3 = new BigDecimal("1234.45");
        BigDecimal num4 = num3.setScale(1);
        System.out.println(num4);
        // 此处抛出异常:java.lang.ArithmeticException: Rounding necessary
    }
4.3 调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法

  通过调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法,传入保留的小数位数 newScale 以及舍入模式 roundingMode(Java BigDecimal 的舍入模式(RoundingMode)详解),可以实现精度设置,demo 如下所示。

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234.455");
        BigDecimal num2 = num1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(num2);
        // 1234.46
        System.out.println(num2.doubleValue());
        // 1234.46
    }
五、常用乘除法(设置精度)
5.1 乘法
	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.multiply(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.81
        System.out.println(ans.doubleValue());
        // 3.81
        System.out.println(ans.intValue());
        // 3
    }
5.2 除法
	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.98
        System.out.println(ans.doubleValue());
        // 3.98
        System.out.println(ans.intValue());
        // 3
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
唔,其实里面就是一个工具加减乘除、保留两位小数。一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text.DecimalFormat; public class Calculation { public static final DecimalFormat df = new DecimalFormat("######0.00"); /** * @methodName format2point * @desc 保留两位小数点 * @param value * @return java.lang.String * @author xm * @create 2018/6/7 12:03 **/ public static String format2point(Number value) { return df.format(value); } public static Double add(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param value1 * 减数 * @param value2 * 被减数 * @return 两个参数的差 */ public static Double sub(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param value1 * 被乘数 * @param value2 * 乘数 * @return 两个参数的积 */ public static Double mul(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算。 * * @param value1 * 除数 * @param value2 * 被除数 * @return 除数/被除数 */ public static Double div(Number value1, Number value2) { //MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);//精度为2,舍入模式为大于0.5进1,否则舍弃 BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.divide(b2).doubleValue(); } public static void main(String[] args) { Double aDouble=Calculation.add(56.9, 1.67); System.out.println(aDouble); Double bDouble=Calculation.sub(99.2,aDouble); System.out.println(bDouble); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值