BigDecimal 用法总结
转载请注明出处:
1.BigDecimal 简介
在进行浮点数 long 或 double 类型的运算时,如果直接进行运算,浮点数的运算会出现精度失准的情况,特别是在计算和金额相关的运算时,必须计算精确,不能出现误差,BigDecimal 的出现就是为了解决 浮点数类型的运算精度失准的场景;
示例:
public static void main(String[] args) {
System.out.println(0.2+0.1);
System.out.println(0.3-0.1);
System.out.println(0.2*0.1);
System.out.println(0.3/0.1);
}
运行后的结果如下:
2.构造BigDecimal的对象
BigDecimal提供了丰富的构造函数,可以通过int、long、double、String等来构造一个BigDecimal对象。
但是,使用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。
BigDecimal bg = new BigDecimal(1.1);
System.out.println(bg.toString()); 运行结果:
1.100000000000000088817841970012523233890533447265625
所以,通常情况下,我们会使用String对象作为参数来构造一个精确的BigDecimal对象。 下面提供的三种方法都是可以的:
//方法一
BigDecimal bg1 = new BigDecimal("1.1");
//方法二
BigDecimal bg2 = new BigDecimal(Double.toString(1.1));
//方法三
BigDecimal bg3 = BigDecimal.valueOf(1.1); System.out.println(bg1.toString());
System.out.println(bg2.toString());
System.out.println(bg3.toString()); 运行结果:
1.1
1.1
1.1
3.常用方法总结
add(BigDecimal): BigDecimal对象中的值相加,返回BigDecimal对象
subtract(BigDecimal): BigDecimal对象中的值相减,返回BigDecimal对象
multiply(BigDecimal): BigDecimal对象中的值相乘,返回BigDecimal对象
divide(BigDecimal): BigDecimal对象中的值相除,返回BigDecimal对象
toString(): 将BigDecimal对象中的值转换成字符串
doubleValue(): 将BigDecimal对象中的值转换成双精度数
floatValue(): 将BigDecimal对象中的值转换成单精度数
longValue(): 将BigDecimal对象中的值转换成长整数
intValue(): 将BigDecimal对象中的值转换成整数
a.max (b) 比较取最大值
a.min(b) 比较取最小值
a.abs() 取最绝对值
negate(): 取相反数
(BigDecimal).compareTo(BigDecimal2) : 比较两个BigDecimal 对象的大小; 返回值为-1,表示bigdemical小于bigdemical2; 返回值为 0,表示bigdemical等于bigdemical2; a = 1,表示bigdemical大于bigdemical2;
4.divide方法使用
BigDecimal中的divide主要就是用来做除法的运算。 方法定义如下:
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)
第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式。 第三个参数可以使用如下常量配置:
BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2 BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3 BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4 BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3 后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
进行除法运算,并四舍五入
System.out.println(new BigDecimal("2322").divide(new BigDecimal("209.123345456667"),2, BigDecimal.ROUND_HALF_UP));
执行结果为 :11.10
5.setScale 方法使用
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
示例:
double dou = 3.14789;
//BigDecimal.ROUND_UP 四舍五入
//BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数
BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);
double newDouble = bigDecimal.doubleValue();
System.out.println("newDouble:" + newDouble);
注: 1、BigDecimal.ROUND_UP 四舍五入,BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数; 2、位数不够时,不会补齐
6.BigDecimal 数据库存储类型对应 decimal
BigDecimal 数据保存在 Mysql 的时候,可以使用 decimal 的数据库数据类型
decimal(m,d)
m是数字的最大位数,他的范围是从1-65;
d是小数点后的位数,他的范围是0-30,并且不能大于m。
如果m被省略了,那么m的值默认为10,
如果d被省略了,那么d的值默认为0.
举例表示:
1、decimal(5,2) 所指代的范围是-999.99~999.99 数字的最大位数是5位,小数点右侧是2位,即有两位小数。
2、decimal(7,6)所指代的范围是-9.999999~9.999999 数字的最大位数是7位,小数点右侧是6位,即有六位小数。
BigDecimal 用法总结的更多相关文章
- BigDecimal用法详解(转)
BigDecimal用法详解 http://www.cnblogs.com/linjiqin/p/3413894.html 一.简介Java在java.math包中提供的API类BigDecim ...
- BigDecimal用法总结
BigDecimal用法总结 BigDecimal常用于金额的计算,下面总结下这次项目中BigDecimal的用法. 1.加减乘除 2.设置精度 3.取反 加减乘除分别调用函数 [java] view ...
- BigDecimal 用法详解
BigDecimal简介 BigDecimal用法: BigDecimal的构造方法 BigDecimal常用方法描述 BigDecimal比较 BigDecimal总结 BigDecimal简介 J ...
- Bigdecimal用法
一.简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- BigDecimal用法详解
一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- 学习BigDecimal用法
一.简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- JAVA BigDecimal 用法
一.BigDecimal 的加减乘除 BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new Big ...
- BigDecimal简单说
1) 浮点数的舍弃规则: 假设小数点后保留两位 RoundingMode.CEILING:向正无穷大的方向舍入: 1.245 → 1.25 -1.245 → -1.24 RoundingMode ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
随机推荐
- PHP几个常见不常用的方法
method_exists判断方法是否存在 <?php class F{ public function __construct(){ if(method_exists($this, 'son_ ...
- 小试牛刀:Linux中部署RabbitMQ
一.下载地址 本人采用的是 RabbitMQ 3.8.20+ Erlang 23.3.4.16 1.Erlang下载:https://github.com/erlang/otp/releases 2. ...
- 5.8 NOI 模拟
\(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...
- Python 爬取途虎养车 全系车型 轮胎 保养 数据
Python 爬取途虎养车 全系车型 轮胎 保养 数据 2021.7.27 更新 增加标题.发布时间参数 demo文末自行下载,需要完整数据私聊我 2021.2.19 更新 增加大保养数据 2020. ...
- ETCD快速入门-03 常用命令
3. ETCD 常用命令 etcdctl是一个命令行的客户端,它提供了一些命令,可以方便我们在对服务进行测试或者手动修改数据库内容.etcdctl与kubectl和systemctl的命令原理 ...
- linux下用docker安装redis
docker安装redis方法: 1.用命令来查看可用版本: docker search redis 2.拉取官方的最新版本的镜像:docker pull redis:latest 3.查看镜像:do ...
- [CF1500E] Subset Trick (平衡树)
题面 洛谷翻译 V a n y a \rm Vanya Vanya 有一个初始大小为 n n n 的集合 S S S 和 q q q 次往集合加数/删数的操作.(集合中每个数字不同) 称一个数 x x ...
- 【Java】学习路径56-TCP协议 发送、接收
与UDP不同的是,TCP协议使用的是Socket,而不是DatagramSocket,这是要作区分的. 构造Socket对象的时候,可以直接指定ip地址与端口号.此时需要抛出异常. import ja ...
- dotnet 设计规范 · 抽象类
X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...
- 基于 Gitea 服务端渲染的 Jupyter Notebooks
本指南将向您展示如何通过配置外部渲染器来使 Gitea 呈现 Jupyter Notebooks.当然,你还可以根据本指南来为你的 Gitea 实例配置其他类型的文档渲染器,甚至是二进制文件!相信Gi ...