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++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
随机推荐
- .NET 5 开源工作流框架elsa技术研究
今天假期第一天,研究了.NET 5开源工作流框架elsa,现在分享给大家. 一.框架简介 elsa是一个开源的.NET Standard 工作流框架,官方网站:https://elsa-workflo ...
- python之scrapy篇(三)
一.创建工程(cmd) scrapy startproject xxxx 二.编写item文件 # -*- coding: utf-8 -*- # Define here the models for ...
- Elasticsearch节点下线(退役)and unassigned shards
一.节点退役当集群中个别节点出现故障预警等情况,需要进行退役工作,即让所有位于该退役节点上的分片的数据分配到其他节点上后,再将此节点关闭并从集群中移除. 1.ES提供了让某个节点上所有数据都移走的功能 ...
- 递归的三部解题曲 关联leetcode 104. 二叉树最大深度练习
递归关心的三点 1. 递归的终止条件 2. 一级递归需要做什么 3. 返回给上一级递归的返回值是什么 递归三部曲 1. 找到递归的终止条件:递归什么时候结束 2. 本级递归做什么:在这级递归中应当完成 ...
- 【项目实践】SpringBoot三招组合拳,手把手教你打出优雅的后端接口
以项目驱动学习,以实践检验真知 前言 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等).请求数据(request).响应数据(response).如何构建这几个 ...
- htaccess在线生成工具用法大全 (转)
对于一个不懂程序的SEOER来做,更改代码方面是一件非常苦难的事情,当我们遇到301转向以及404页面的制作问题时,经常会困恼我们,这里我提供一个htaccess在线生成工具,这里有404页面链接生成 ...
- 剑指Offer58-左转字符串
题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...
- LeetCode897. 递增顺序查找树
题目 法一.自己 1 class Solution { 2 public: 3 vector<int>res; 4 TreeNode* increasingBST(TreeNode* ro ...
- 目录遍历 - Pikachu
概述: 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应 ...
- SAP 修改表和表中数据
平时修改表中数据的方式有一下几种: 1.一般就是通过SE11或者是SE16进去,找到那条记录,然后将模式变成EDIT,然后修改保存. 2.通过SQL语句在程序中实现数据库表的修改操作 3.通过SE16 ...