BigDecimal用法

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

文章目录

      • 1、创建一个BigDecimal对象
        • 1.1、常用构造函数
        • 1.1、常用计算方法
      • 2、BigDecimal很方便的几个用法
        • 2.1、用BigDecimal去除小数点后多余的0:stripTrailingZeros()
        • 2.2、BigDecimal的原值和科学计数值
        • 2.3、用BigDecimal比较大小:compareTo()
        • 2.4、BigDecimal格式化
      • 3、BigDecimal使用须知

前几天在进行计算操作的时候发生了精度丢失的问题,就查了一下防止精度丢失的办法:BigDecimal;了解之后感觉BigDecimal还是很有意思的,就总结一下:

1、创建一个BigDecimal对象

1.1、常用构造函数

构造器:

构造方法描述
BigDecimal(int)创建一个具有参数所指定整数值的对象。
BigDecimal(double)创建一个具有参数所指定双精度值的对象。
BigDecimal(long)创建一个具有参数所指定长整数值的对象
BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。
// int
BigDecimal bigDecimal1 = new BigDecimal(1);// double
BigDecimal bigDecimal2 = new BigDecimal(0.1);// long
BigDecimal bigDecimal3 = new BigDecimal(100L);// String
BigDecimal bigDecimal4= new BigDecimal("0.1");System.out.println(bigDecimal1);
System.out.println(bigDecimal2);
System.out.println(bigDecimal3);
System.out.println(bigDecimal4);

输出结果:
在这里插入图片描述
这里可以看到用double类型的数据去创建BigDecimal 的结果不一样:
其实这也就是我们使用double来进行计算的时候会出现精度丢失的原因,十进制转二进制的时候有些十进制数是无法使用一个有限的二进制数来表达的,换言之就是转换的时候出现了精度的丢失问题,所以说BigDecimal(double)这个构造的结果是不可预知的;
与BigDecimal(double)相比,BigDecimal(String)就是完全符合我们预期的,所以通常都推荐用BigDecimal(String);

1.1、常用计算方法

方法描述
add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。
toString()将BigDecimal对象的数值转换成字符串。
doubleValue()将BigDecimal对象中的值以双精度数返回。
floatValue()将BigDecimal对象中的值以单精度数返回
		BigDecimal zero1 = new BigDecimal("1.5");BigDecimal zero2 = new BigDecimal("0.5");BigDecimal zero3 = new BigDecimal("5");// 加System.out.println(zero1.add(zero2));// 减System.out.println(zero1.subtract(zero2));// 乘System.out.println(zero1.multiply(zero2));// 除System.out.println(zero1.divide(zero2));System.out.println(zero3.toString());System.out.println(zero3.doubleValue());System.out.println(zero3.floatValue());

结果:
在这里插入图片描述

2、BigDecimal很方便的几个用法

2.1、用BigDecimal去除小数点后多余的0:stripTrailingZeros()

用BigDecimal计算会生成多余的0,比如下面:

System.out.println(new BigDecimal("2.0").multiply(new BigDecimal("1.0")));

结果:
在这里插入图片描述

// 去除多余的0
System.out.println(new BigDecimal("2.0").multiply(new BigDecimal("1.0")).stripTrailingZeros());

结果:
在这里插入图片描述

2.2、BigDecimal的原值和科学计数值

当我们使用上面的stripTrailingZeros()时,有时候会出现一些问题。比如我有一个数值是10.0000000000000,我用stripTrailingZeros()想去除多余的0:

		System.out.println( new BigDecimal("10.0000000000000").stripTrailingZeros());

结果:
在这里插入图片描述
或者在进行一些运算的时候,比如0/0.5,0除以任何数都应该是0:

		System.out.println(new BigDecimal("0").divide(new BigDecimal("0.05")));

在这里插入图片描述
这其实并不是出了问题,而是科学计数值;如果我们不行输出科学计数值,可以用toPlainString()输出原值:;

		System.out.println("科学计数值:" + new BigDecimal("0").divide(new BigDecimal("0.05")));System.out.println("原值:" + new BigDecimal("0").divide(new BigDecimal("0.05")).toPlainString());System.out.println("科学计数值:" + new BigDecimal("10.000000000000").stripTrailingZeros());System.out.println("原值:" +new BigDecimal("10.000000000000").stripTrailingZeros().toPlainString());

结果:在这里插入图片描述

2.3、用BigDecimal比较大小:compareTo()

即左边比右边数大,返回1,相等返回0,比右边小返回-1。

BigDecimal a = new BigDecimal("1.5");
BigDecimal b = new BigDecimal("0.5");
BigDecimal c = new BigDecimal("2.5");
BigDecimal d = new BigDecimal("1.5");
// 比较大小
System.out.println(a.compareTo(b));
System.out.println(a.compareTo(c));
System.out.println(a.compareTo(d));

结果:
在这里插入图片描述

2.4、BigDecimal格式化

BigDecimal对象可以作为NumberFormat类的format()方法的参数,可以对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。

		// 货币格式System.out.println("货币:" + NumberFormat.getCurrencyInstance().format(new BigDecimal("123.56")));// 百分比格式NumberFormat percent = NumberFormat.getPercentInstance();// 百分比小数点最多3位percent.setMaximumFractionDigits(3);System.out.println("百分比:" + percent.format(new BigDecimal("0.036")));

结果:在这里插入图片描述

3、BigDecimal使用须知

  • BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal,在需要精确的小数计算时再使用BigDecimal;
  • 尽量使用参数类型为String的构造函数。 BigDecimal都是不可变的(immutable)的,在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

http://chatgpt.dhexx.cn/article/E1MS2jNl.shtml

相关文章

mysql bigdecimal查询_mysql bigdecimal

java学习:Java中的其它类 568x573 - 55KB - JPEG Java中BigDecimal类你了解多少?! 720x480 - 30KB - JPEG TypeHandlers 640x396 - 25KB - JPEG BigDecimal equals方法可能不相等 678x260 - 9KB - JPEG

BigDecimal 详解

一,BigDecimal的简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。 双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学…

BigDecimal加减乘除计算

BigDecimal的运算——加减乘除 首先是bigdecimal的初始化 这里对比了两种形式,第一种直接value写数字的值,第二种用string来表示 我们对其进行加减乘除绝对值的运算,其实就是Bigdecimal的类的一些调用 BigDecimal num1 new BigDecimal(0.005);BigDecim…

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会…