系列文章目录

有Math取整方式,java自带运算,为什么还选要学习 BigDecimal



文章目录

  • 系列文章目录
  • 前言
  • 一、BigDecimal是什么?
  • 二、使用步骤
  • 1.构造器使用
  • 2.方法使用
  • 总结



前言

随着计算复杂,用户需求变大,传统取整不能满足用户需求,计算精度同样需要更加精确

1️⃣ 比如下面,浮点数影响了计算精度值

Java中的取模 java bigdecimal取模_java

注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值

特别是金融项目,出现 0.30000000000000004 体验不是特别好。

2️⃣还有如果需要对金额,进行四舍五入,保留2位。Math.round() 不能满足事件需求

所以 我们才会考虑用 BigDecimal ,解决这些问题


一、BigDecimal是什么?

翻译:Big+Decimal (大的 十进制,双精度)
读音:[ˈdesɪml]
官方;Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算


二、使用步骤

1.构造器使用

代码如下(示例):

BigDecimal bigDecimal=new BigDecimal(0.3);
  BigDecimal bigDecimal=new BigDecimal("0.3");

下面举例是其他的

Java中的取模 java bigdecimal取模_System_02

BigDecimal(double val) 将双精度浮点型转换为BigDecimal
BigDecimal(String val) 将字符串形式转换为BigDecimal(推荐)

为什么推荐使用字符串形式呢?

Java中的取模 java bigdecimal取模_System_03


可见,Double数据类型是会受到影响,所以推荐用字符串!

如果 一定要用Double,那我们可以把它先转化为字符串吧!有2种方法

BigDecimal d1=BigDecimal.valueOf(0.3);
BigDecimal d2=new BigDecimal(Double.toString(0.3));

2.方法使用

BigDecimal类型的数字可以用来做超大的浮点数的运算,如+、-、*、\等
其中除法需要涉及到 除不尽,小数处理

方法

说明

add(BigDecimal)


subtract(BigDecimal)


multiply(BigDecimal)


divide(BigDecimal ,int,RoundingMode)

除,3个参数,分别表示除数,保留小数点,小数点处理方式

代码如下(示例):

BigDecimal str1=new BigDecimal("0.9234567890123456789");
BigDecimal str2=new BigDecimal("0.1234567890123456789");

System.out.println(str1.add(str2));
System.out.println(str1.subtract(str2));
System.out.println(str1.multiply(str2));

Java中的取模 java bigdecimal取模_字符串_04


小数点处理方式(整理常用4种)

模式

说明

保留2位例子

RoundingMode.UP

向上取整 类似 (ceil)

1.051→1.06

RoundingMode.HALF_UP

四舍五进 (常用)

1.054→1.05;1.055→1.06

RoundingMode.DOWN

向下取整 类似(floor)

1.059→1.05

RoundingMode.HALF_DOWN

五舍六进

1.055→1.05;1.056→1.06

代码如下(示例):

BigDecimal bigDecimal=new BigDecimal("1.051");
 System.out.println(bigDecimal.setScale(2, RoundingMode.UP));//1.06

 BigDecimal bigDecimal=new BigDecimal("1.059");
 System.out.println(bigDecimal.setScale(2, RoundingMode.DOWN));//1.05

我们可用 setScale单独进行小数点处理

我们用除法做一个小案例。

BigDecimal str1=new BigDecimal("0.9234567890123456789");
 BigDecimal str2=new BigDecimal("0.1234567890123456789");
 System.out.println(str1.divide(str2,2,RoundingMode.HALF_UP));

总结

BigDecimal个人觉得是对Math基础用法补充:

  • 作用1、可让浮点数超大的进行运算
  • 作用2、可处理浮点数出现精度浮点问题
  • 作用3、可处理小数点保留位数

其实我也同时想起 Calendar 对 Date补充

还有可以去参考 Math用法,希望对你有帮助