BigDecimal 用法详解
BigDecimal简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。
BigDecimal用法:
BigDecimal创建的是对象,不能使用+,-,*,/等算术运算,必须调用它对应的相关方法。
并且,方法中的参数也必须是BigDecimal对象。
BigDecimal的构造方法
- BigDecimal(int) 创建一个具有参数所指定整数值的对象。
- BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
- BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
- BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
BigDecimal b = new BigDecimal(0);
BigDecimal b = new BigDecimal(1.2);
BigDecimal b = new BigDecimal("2.3");
String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言, 通常建议优先使用String构造方法。
当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。
BigDecimal常用方法描述
- add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
- subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
- multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
- divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
- toString() 将BigDecimal对象的数值转换成字符串。
- doubleValue() 将BigDecimal对象中的值以双精度数返回。
- floatValue() 将BigDecimal对象中的值以单精度数返回。
- longValue() 将BigDecimal对象中的值以长整数返回。
- intValue() 将BigDecimal对象中的值以整数返回。
item.setScore(
(value.multiply(lmd).add((statuValue.divide(targetValue,3,RoundingMode.HALF_UP))
.multiply(lmd))).multiply(new BigDecimal(100))
);
BigDecimal格式化
由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
以利用BigDecimal对货币和百分比格式化为例。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。
public static void main(String[] args) {
NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
percent.setMaximumFractionDigits(3); //百分比小数点最多3位
BigDecimal loanAmount = new BigDecimal("15000.48"); //贷款金额
BigDecimal interestRate = new BigDecimal("0.008"); //利率
BigDecimal interest = loanAmount.multiply(interestRate); //相乘
System.out.println("贷款金额:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));
}
//贷款金额: ¥15,000.48 利率: 0.8% 利息: ¥120.00
BigDecimal比较
publicstaticvoidmain(String[]args){
BigDecimala=newBigDecimal("1");
BigDecimalb=newBigDecimal("2");
BigDecimalc=newBigDecimal("1");
intresult1=a.compareTo(b);
intresult2=a.compareTo(c);
intresult3=b.compareTo(a);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
// -1 0 1
即左边比右边数大,返回1,相等返回0,比右边小返回-1。注意 不可用equals进行相等的判断,equals 比较是两个BigDecimal对象的地址。
BigDecimal总结
在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。
尽量使用参数类型为String的构造函数。
BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。
在使用BigDecimal做除法(.divide)运算时,如果结果为一个除不尽的数字,则会抛出异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
所以,这是必须使用构造模型来格式化小数点:
b.divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_UP);
BigDecimal.setScale();//用于格式化小数点
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则向下舍
1、ROUND_UP
2.舍入远离零的舍入模式。
3.在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
4.注意,此舍入模式始终不会减少计算值的大小。
5.2、ROUND_DOWN
6.接近零的舍入模式。
7.在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
8.注意,此舍入模式始终不会增加计算值的大小。
9.3、ROUND_CEILING
10.接近正无穷大的舍入模式。
11.如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
12.如果为负,则舍入行为与 ROUND_DOWN 相同。
13.注意,此舍入模式始终不会减少计算值。
14.4、ROUND_FLOOR
15.接近负无穷大的舍入模式。
16.如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
17.如果为负,则舍入行为与 ROUND_UP 相同。
18.注意,此舍入模式始终不会增加计算值。
19.5、ROUND_HALF_UP
20.向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
21.如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
22.注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
23.6、ROUND_HALF_DOWN
24.向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
25.如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
26.7、ROUND_HALF_EVEN
27.向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
28.如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
29.如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
30.注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
31.此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
32.如果前一位为奇数,则入位,否则舍去。
33.以下例子为保留小数点1位,那么这种舍入方式下的结果。
34.1.15>1.2 1.25>1.2
35.8、ROUND_UNNECESSARY
36.断言请求的操作具有精确的结果,因此不需要舍入。
37.如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
相关内容来源:
BigDecimal用法详解
BigDecimal 用法详解的更多相关文章
- BigDecimal用法详解(转)
BigDecimal用法详解 http://www.cnblogs.com/linjiqin/p/3413894.html 一.简介Java在java.math包中提供的API类BigDecim ...
- BigDecimal用法详解
一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)
转自:https://blog.csdn.net/ochangwen/article/details/51531866 一.简介 Java在java.math包中提供的API类BigDecimal,用 ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
随机推荐
- hive优化之小文件合并
文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...
- python第一节:变量及数据类型
一.变量 1.什么是变量 变:即为变化的事物 量:即为事物当前的状态 2.为什么用变量 变量可以方便的记录事物当前状态,在后面随时可以调出使用 3.怎么用变量 变量使用前需要先进行赋值(记录状态) 赋 ...
- Pytest测试框架(五):pytest + allure生成测试报告
Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...
- 2020 年度编程语言排行榜出炉!C 语言称霸,Java 遭遇滑铁卢…….
最近,TIOBE 发布了过去一年的编程语言排行榜: 数据来源TIOBE: https://www.tiobe.com/tiobe-index/ TIOBE介绍: TIOBE编程语言索引是编程语言流行程 ...
- 解决 unknown filesystem type ntfs U盘/移动硬盘挂载出错问题
大内存U盘或者移动硬盘挂在再Linux 时,报错unknown filesystem type ntfs 1.安装ntfs-3g wget http://tuxera.com/opensource/n ...
- Java并发编程实战(4)- 死锁
在这篇文章中,我们主要讨论一下死锁及其解决办法. 目录 概述 死锁案例 死锁的原因和预防 破坏占用且等待条件 破坏不可抢占条件 破坏循环条件 使用等待-通知机制 Java中的等待-通知机制 条件曾经满 ...
- MySQL--运行机制,SQL执行顺序,Explain
MySQL的运行机制是什么? 首先客户端先要发送用户信息去服务器端进行授权认证,当输入正确密码之后可以连接到数据库了,当连接服务器端成功之后就可以正常的执行 SQL 命令了,MySQL 服务器拿到 ...
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ Masstransit 介绍)--学习笔记
2.6.6 RabbitMQ -- Masstransit 介绍 Masstransit 是什么 Quickstart 消息 Message Masstransit 是什么 Masstransit 是 ...
- LeetCode220 存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...
- 【Oracle】DRM官方介绍
DRM 简介 By: Allen Gao 首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer ...