首页 > 编程语言 >java精确除法运算-BigDecimal

java精确除法运算-BigDecimal

时间:2023-06-02 16:32:52浏览次数:34  
标签:1.5 java BigDecimal 1.8 divide 除法 1.1


一、BigDecimal介绍
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算.
  其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类.
  BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念.
  float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值.
  BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.

二、构造BigDecimal 对象常用方法以及转换为基本数据类型方法
2.1构造BigDecimal 对象常用方法

1、方法一

BigDecimal BigDecimal(double d); //不允许使用
  2、方法二

BigDecimal BigDecimal(String s); //常用,推荐使用
3、方法三

static BigDecimal valueOf(double d); //常用,推荐使用
注意:
  1. double 参数的构造方法,不允许使用!!!因为它不能精确的得到相应的值,值会变大;
  2. String 构造方法是完全可预知的: 写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使用 String 构造方法;
  3. 静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法;

2.2 换为基本数据类型方法

toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
三、BigDecimal对象的常用方法
1.BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和。

2.BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差。

3.BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积。

4.BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商。

5.BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数。

6.BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值。

7.BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值。

8.BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值。

9.BigDecimal negate():相反数,求BigDecimal类型数据的相反数。
四、除法运算的函数可以指定小数点后保留位数和取舍规则
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;

除法 divide有三个参数的方法,第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则。只有在作除法运算或四舍五入时才用到取舍规则。 因为BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。所以当我们用三参数的除法方法时,规定了保留几位小数以及你的保留方式,就可以避免异常。

ROUND_CEILING:舍位时往正无穷方向移动
正数:1.1 -> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -1 -1.5-> -1 -1.8-> -1

ROUND_DOWN:向0的方向移动
正数:1.1-> 1 1.5-> 1 1.8-> 1
负数:-1.1-> -1 -1.5-> -1 -1.8> -1

ROUND_FLOOR:与CEILING相反,往负无穷
正数: 1.1-> 1 1.5-> 1 1.8-> 1
负数: -1.1-> -2 -1.5-> -2 -1.8-> -2

ROUND_HALF_DOWN:以5为分界线,或曰五舍六入
正数:1.5-> 1 1.6-> 2
负数:-1.5-> -1 -1.6-> -2

ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数
1.15-> 1.2 1.16-> 1.2 1.25-> 1.2 1.26-> 1.3

ROUND_HALF_UP:最常见的四舍五入

ROUND_UNNECESSARY:无需舍位

ROUND_UP与ROUND_DOWN相反,远离0的方向
正数:1.1-> 2 1.5-> 2 1.8-> 2
负数:-1.1-> -2 -1.5-> -2 -1.8-> -2
四、如果你想格式化小数
4.1BigDecimal.setScale()方法用于格式化小数点

参数一:保留的小数位数 参数二:取舍规则是必须的

public class TestBigDecimal {
public static void main(String[] args) {

BigDecimal b1 = new BigDecimal("123.564");
    b1.setScale(2);
    System.out.println(b1);
}

}

异常:
Exception in thread “main” java.lang.ArithmeticException: Rounding necessary
4.2除法的使用
public class TestBigDecimal {
public static void main(String[] args) {

BigDecimal b1 = new BigDecimal("123.564");
    BigDecimal b2 = new BigDecimal("3.3");
    BigDecimal divide = b1.divide(b2, 10, RoundingMode.HALF_UP);
    System.out.println(divide);

}

}


标签:1.5,java,BigDecimal,1.8,divide,除法,1.1
From: https://blog.51cto.com/chengzheng183/6403961

相关文章

  • java 实现AES加解密后,与在线工具测试结果不一致
    最近有个项目,因为参数里面带有sql可能是客户网关对参数做了防侵入,用简单的base64加密后居然还是不行,决定用AES加密。代码如下。/***参数加密私钥*/staticfinalStringparamPrivateKey="3dae12897b044f96";声明密钥/***加密*@paramsSrc......
  • 学Java必备EditPlus的安装与配置
    Editplus是一款很受欢迎的编辑器。简单的解释editplus软件的话,它就是一款功能更强大的记事本。除了普通的文本编辑之外,还有很多的其他特点。这篇文章详细讲讲Editplus的安装配置,配合视频观看学习效果更佳动力节点老杜的Java17版入门教程,详细讲了关于Editplus的安装配置这套JavaSE教......
  • Java 将字符串转换为Document对象
    可以使用JAXP(JavaAPIforXMLProcessing)提供的DocumentBuilder类将字符串数据转换成Document对象。具体步骤如下:1.创建一个DocumentBuilderFactory对象,用于创建DocumentBuilder对象。DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();2.创建一个D......
  • Java应用架构演变史
    垂直应用架构以MVC的垂直架构举例,MVC架构通常分为3层,展示层、控制层、模型层。通常基于MVC架构开发的应用代码会打成一个war包,部署在Tomcat等Web容器中。不同的业务模块间通过本地API进行调用,基本不存在跨进程的远程服务调用。垂直应用架构面临的挑战:复杂应用的开发和......
  • java中 static 关键词
    在Java中,static是一个关键字,可以用于变量、方法和代码块上。1.静态变量(staticvariable)静态变量是被声明为static的变量。它属于类,而不是属于任何一个对象的。因此,无论创建了多少个类的对象,静态变量只有一份拷贝,所有对象共享同一个静态变量。静态变量可以通过"类名.变量名"的方......
  • Java入门讲解之EditPlus的安装与配置
    正好在学习java,使用到EditPlus软件,跟大家分享一下editplus的安装与配置过程:也可以直接看视频安装,B站上动力节点老杜的Java17版入门教程,详细讲了关于Editplus的安装配置学习地址:https://www.bilibili.com/video/BV1ig4y1c7kPEditPlus的安装与配置为什么不建议初学者一开始就用......
  • eclipse集成Java性能分析神器JProfiler
    JProfiler是一款功能强大的Java开发分析工具,能帮助从事编程工作的朋友们分析你们的代码数据,确定内存泄漏并了解线程问题。1、下载JProfilerhttps://www.ej-technologies.com/download/jprofiler/files可以根据系统位数选择具体版本的JProfiler2、安装JProfiler下载绿色版本JPro......
  • Java Properties类
    Properties处理两种行,自然行和逻辑行。逻辑行:用反斜线在一行的末尾,会和相邻的下一行形成逻辑行,如下org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration自然行就是以\n or \r or \r\n结尾......
  • JAVA爬数据也是杠杠的,爬下杜大哥
    上篇分析的网站是国家级,没有真正编写代码爬取对应的数据,今天以“1药网”为例来爬一爬药品数据https://www.111.com.cn/1、分析网站进入网站首页2、点击一下“所有商品分类”,对应的网站地址如下https://www.111.com.cn/categories/先爬取所有的“分类”,然后在根据“分类”获取......
  • JAVA通过oshi获取系统和硬件信息
    JAVA通过oshi获取系统和硬件信息 一、引入jar包本项目主要使用第开源jar包:https://github.com/oshi/oshi<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</vers......