BigDecimal加减乘除计算

article/2025/10/1 5:54:56

BigDecimal的运算——加减乘除

首先是bigdecimal的初始化

这里对比了两种形式,第一种直接value写数字的值,第二种用string来表示
我们对其进行加减乘除绝对值的运算,其实就是Bigdecimal的类的一些调用

  1. BigDecimal num1 = new BigDecimal(0.005);
  2. BigDecimal num2 = new BigDecimal(1000000);
  3. BigDecimal num3 = new BigDecimal(-1000000);
  4. //尽量用字符串的形式初始化
  5. BigDecimal num12 = new BigDecimal("0.005");
  6. BigDecimal num22 = new BigDecimal("1000000");
  7. BigDecimal num32 = new BigDecimal("-1000000");

加法 add()函数 减法subtract()函数 乘法multiply()函数 除法divide()函数 绝对值abs()函数

承接上面初始化Bigdecimal分别用string和数进行运算对比

  1. //加法
  2. BigDecimal result1 = num1.add(num2);
  3. BigDecimal result12 = num12.add(num22);
  4. //减法
  5. BigDecimal result2 = num1.subtract(num2);
  6. BigDecimal result22 = num12.subtract(num22);
  7. //乘法
  8. BigDecimal result3 = num1.multiply(num2);
  9. BigDecimal result32 = num12.multiply(num22);
  10. //绝对值
  11. BigDecimal result4 = num3.abs();
  12. BigDecimal result42 = num32.abs();
  13. //除法
  14. BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
  15. BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);

把result全部输出可以看到结果
这里出现了差异,这也是为什么初始化建议使用string的原因

注意:

1)System.out.println()中的数字默认是double类型的,double类型小数计算不精准。

2)使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!

因为不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值,因此它会被表示成与它最接近的 double 类型的值。必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。

除法divide()参数使用

使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
我们可以看到divide函数配置的参数如下:

即为 (BigDecimal divisor 除数, int scale 精确小数位, int roundingMode 舍入模式)

可以看到舍入模式有很多种BigDecimal.ROUND_XXXX_XXX, 具体都是什么意思呢


计算1÷3的结果(最后一种ROUND_UNNECESSARY在结果为无限小数的情况下会报错)

八种舍入模式解释如下

1、ROUND_UP

舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。


http://chatgpt.dhexx.cn/article/9YNSGOIT.shtml

相关文章

java 中 BigDecimal 详解

首先,学习一个东西,我们都必须要带着问题去学,这边我分为 【为什么?】【是什么?】【怎么用?】 【为什么要用BigDecimal?】 首先,我们先看一下,下面这个现象 那为什么会…

Java —— JDBC关闭Statement后是否还需要关闭ResultSet?

一、问题描述 下面的代码使用了try-with-resource语法,会自动关闭Connection和Statement,是否还需要关闭ResultSet? Statement关闭后ResultSet会被回收么? 二、JDBC规范 JDBC规范4.3中有对Statement关闭后是否需要关闭ResultSet进行说明。…

ResultSet(结果集)、Statement

ResultSet 基本介绍: 1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成 2.ResultSet对象保持一个光标指向其当前的数据行,光标最初在第一行之前 3.next()方法是将光标移动到下一行,并且由于在ResultSet对象中没有…

【JDBC】------ResultSet(结果集)和常见异常

分享第二十条励志语句 宁可自信,也不要盲目悲观。因为自信是一种力量,即使你的自信有些盲目,也无关大局,你可以在实践中调整心态,找到自己的恰当的位置。如果盲目自卑,你就必然失去一切。 目录 分享第二十…

JDBC的ResultSet

一、ResultSet[结果集] 1.表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 2.ResultSet对象保持一个光标指向其当前的数据行,最开始光标在第一行。 3.next方法将光标移动到下一行,由于在ResultSet对象中没有更多行时返回fal…

Java中,ResultSet 的用法

•在Java中,获得ResultSet的总行数的方法有以下几种。 第一种:利用ResultSet的getRow方法来获得ResultSet的总行数 Java代码 Statement stmt con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet r…

ResultSet结果集的使用

一、ResultSet结果集的简介 查询数据库时,返回的是一个二维的结果集,我们需要用到ResultSet来遍历结果集,获取每一行的数据。 二、使用ResultSet遍历查询结果 boolean next() 将光标从当前位置向前移一行。 String  getString(int column…

ResultSet用法集锦

ResultSet用法集锦 添加链接描述 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.结果集读取数据…

ResultSet的介绍与使用

相关文章 jdbc连接以及出现的异常处理Jdbc工具类ResultSet的介绍与使用jdbc中的sql注入PreparedStatement的介绍与解决sql注入jdbc管理事务 ResultSet ResultSet是我们使用jdbc连接时,查询的一个返回结果集,ResultSet resultSet stmt.executeQuery(sql),下面就使用…

JDBC之ResultSet接口

ResultSet介绍 对数据库的查询操作,一般需要返回查询结果。在程序中,JDBC为我们提供了ResultSet接口来专门处理查询结果集。 由于ResultSet是JDBC的一个接口,先来简单了解一下JDBC: JDBC:Java Database Connection&am…

android studio BindService

一.输入: 1.全部代码: 主界面代码: public class BindServiceActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG "BindServiceActivity";private Button mBtBindService;…

Service中bindService

最近有用到Activity需要不断的从Service中获取数据,第一个想法肯定就是通过bind回调机制了,有几点概念模糊特此记录下: 单独使用bindService(),unbindService()会经历:->onCreate()->onBind()->Service runn…

bindService不调用onServiceConnected的问题

bindService不调用onServiceConnected的问题 昨天做一个项目时,Activity需要bindService获取到service实例与service进行交互,创建好service如下(例): class MyService{private IBinder mBinder new MyServicerBind…

bind服务

一、域名 www.baidu.com www.baidu.com. (.)根域 (com)一级域名 (baidu)二级域名 二、DNS解析记录分类 A记录、CNAME、MX记录、NS记录 1、A记录 通过域名直接查询到IP 例如&…

bindService启动流程

通过bindService启动的Service,会执行Service的onCreate、onBind、onUnbind、onDestroy方法,可以通过onBind方法返回的Binder对象和调用端进行通信,并且Service的生命周期和调用端同步。 如下是启动bindService的代码 var stu: Student? null val con…

AIDL报错,bindService一直连接不上、不起作用。

先说问题,最近用aidl,发现bindService根本就不走,不知道咋回事,明明写的没有任何毛病啊? //aidl绑定private void bind() {Intent intent new Intent();String pkg "com.example.mzz_service";//需要调用…

服务两种启动方式(startService与bindService)的区别

综上两篇文章 1.Android Service的基本用法(startService启动方式生命周期) 2.Android Service与Activity之间的通信(bindService启动方式) 区别如下: 一.生命周期上的区别 startService启动服务:Service会…

进程间通讯:Binder:bindService之 onServiceConnected回调

1:bindService官方概述 很明显 通过Google官方文档描述,我们知道 1:bindService()的返回值只是表明服务是否存在; 2:真正能代表是否成功绑定服务的是触发onServiceConnected(&…

Android入门第41天-Android中的Service(bindService)

介绍 在前一天我们介绍了Android中有两种启动Service的方法。并擅述了startService和bindService的区别。同时我们着重讲了startService。 因此今天我们就来讲bindService。bindService大家可以认为它是和Android的一个共生体。即这个service所属的activity如果消亡那么bindS…

Android Binder框架实现之bindService详解

Android Binder框架实现之bindService详解 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android Binder框架实现之何为匿名/实名Binder Android Binder框架实现之Binder中的数据结构 Android Binder框架实现之Binder相关的接口和类 Andr…