浅谈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 如下所示。
四、设置精度(保留小数位)
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 }
到此这篇关于浅谈Java中BigDecimal类的简单应用的文章就介绍到这了,更多相关Java的BigDecimal类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
如何解决HttpServletRequest.getInputStream()多次读取问题
这篇文章主要介绍了如何解决HttpServletRequest.getInputStream()多次读取问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-07-07
最新评论