BigDecimal简介

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。


BigDecimal用法:

BigDecimal创建的是对象,不能使用+,-,*,/等算术运算,必须调用它对应的相关方法。

并且,方法中的参数也必须是BigDecimal对象。

BigDecimal的构造方法

  1. BigDecimal(int) 创建一个具有参数所指定整数值的对象。
  2. BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
  3. BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
  4. 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常用方法描述

  1. add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
  2. subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
  3. multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
  4. divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
  5. toString() 将BigDecimal对象的数值转换成字符串。
  6. doubleValue() 将BigDecimal对象中的值以双精度数返回。
  7. floatValue() 将BigDecimal对象中的值以单精度数返回。
  8. longValue() 将BigDecimal对象中的值以长整数返回。
  9. 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 用法详解的更多相关文章

  1. BigDecimal用法详解(转)

    BigDecimal用法详解    http://www.cnblogs.com/linjiqin/p/3413894.html 一.简介Java在java.math包中提供的API类BigDecim ...

  2. BigDecimal用法详解

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

  3. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    转自:https://blog.csdn.net/ochangwen/article/details/51531866 一.简介 Java在java.math包中提供的API类BigDecimal,用 ...

  4. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  5. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  6. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  7. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  8. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

随机推荐

  1. ssh 免密设置

    在master中生成dsa: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/author ...

  2. spring*.xml配置文件明文加密

    spring*.xml配置文件明文加密 说明:客户要求spring*.xml中Oracle/Redis/MongoDB的IP.端口.用户名.密码不能明文存放,接到需求的我,很无奈,但是还是的硬着头皮搞 ...

  3. MariaDB Galera Cluster集群搭建

    MariaDB Galera Cluster是什么?   Galera Cluster是由第三方公司Codership所研发的一套免费开源的集群高可用方案,实现了数据零丢失,官网地址为http://g ...

  4. Spring Cloud Gateway 跨域 CORS 配置方式实现

    网上找了一堆文章全是说这样写无效 globalcors: cors-configurations: '[/**]': allowCredentials: true allowedOriginPatte ...

  5. Vue css过渡 和 js 钩子过渡

    css过渡 <transition name="slide"> <div v-show="!showChatInput" class=&quo ...

  6. LeetCode747 至少是其他数字两倍的最大数

    在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...

  7. Java线程安全与锁优化,锁消除,锁粗化,锁升级

    线程安全的定义 来自<Java高并发实战>"当多个线程访问一个对象的时候,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法的时候进行任何 ...

  8. 使用nodejs和express搭建http web服务

    目录 简介 使用nodejs搭建HTTP web服务 请求nodejs服务 第三方lib请求post 获取http请求的正文 Express和使用express搭建http web服务 express ...

  9. 【栈和队列】5、队列概述与数组队列的基本实现 - Java

    3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...

  10. 【Oracle】translate函数用法解析

    转自:https://blog.csdn.net/shwanglp/article/details/52814173 基本语法: translate(string,from_str,to_str); ...