[转]BigDecimal使用(整理)
原文地址:https://www.jianshu.com/p/2947868d76eb
应用场景
大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。比如:货币
使用
1、构建BigDecimal
BigDecimal BigDecimal(double d); //不允许使用,精度不能保证
BigDecimal BigDecimal(String s); //常用,推荐使用
static BigDecimal valueOf(double d); //常用,推荐使用
2、方法
| 方法 | 描叙 |
|---|---|
| add(BigDecimal) | BigDecimal对象中的值相加,然后返回这个对象 |
| subtract(BigDecimal) | BigDecimal对象中的值相减,然后返回这个对象 |
| multiply(BigDecimal) | BigDecimal对象中的值相乘,然后返回这个对象 |
| divide(BigDecimal) | BigDecimal对象中的值相除,然后返回这个对象 |
| toString() | 将BigDecimal对象的数值转换成字符串 |
| doubleValue() | 将BigDecimal对象中的值以双精度数返回 |
| floatValue() | 将BigDecimal对象中的值以单精度数返回 |
| longValue() | 将BigDecimal对象中的值以长整数返回 |
| intValue() | 将BigDecimal对象中的值以整数返回。 |
3、格式化和四舍五入
// 格式化:保留2为小数
DecimalFormat df = new DecimalFormat("#.##");
// 四舍五入,默认五舍六入
df.setRoundingMode(RoundingMode.HALF_UP);
4、格式化
DecimalFormat 解析:
| 符号 | 位置 | 描叙 |
|---|---|---|
| 0 | 数字 | 阿拉伯数字,如果不存在则显示0 |
| # | 数字 | 阿拉伯数字,如果不存在不显示0 |
| . | 数字 | 小数分隔符或货币小数分隔符 |
| , | 数字 | 分组分隔符 |
| E | 数字 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 |
| - | 数字 | 负号 |
| ; | 子模式边界 | 分隔正数和负数子模式 |
| % | 前缀或后缀 | 乘以 100 并显示为百分数 |
| \u2030 | 前缀或后缀 | 乘以 1000 并显示为千分数 |
| ¤(\u00A4) | 前缀或后缀 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 |
| ' | 前缀或后缀 | 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#"将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"。 |
5、舍入模式介绍
RoundingMode.CEILNG:向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于RoundingMode.UP;如果结果为负,则舍入行为类似于RoundingMode.DOWN
如下:
5.5 => 6
1.1 => 2
-1.0 => -1
-2.5 => -2
RoundingMode.DOWN:向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值
如下:
5.5 => 5
1.1 => 1
-1.0 => -1
-1.6 => -1
RoundingMode.FLOOR:向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于 RoundingMode.UP
注意:此舍入模式始终不会增加计算值
如下:
5.5 => 5
2.3 => 2
1.0 => 1
-1.1 => -2
-2.5 => -3
- RoundingMode.HALF_DOWN :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN;
五舍六入
如下:
2.5 => 2
1.6 => 2
-1.1 => -1
-1.6 => -2
-2.5 => -2
- RoundingMode.HALF_EVEN :向 最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍 入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略
如下:
5.5 => 6
2.5 => 2
1.1 => 1
-1.0 => -1
-1.6 => -2
-2.5 => -2
- RoundingMode.HALF_UP :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN
注意:此舍入模式就是通常学校里讲的四舍五入
如下:
2.5 => 3
1.1 => 1
-1.1 => -1
-1.6 => -2
- RoundingMode.UNNECESSARY :用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException
如下:
1.5 => 抛出 ArithmeticException
1.1 => 抛出 ArithmeticException
1.0 => 1
-1.1 =>抛出 ArithmeticException
-1.6 => 抛出 ArithmeticException
- RoundingMode.UP :远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值
如下:
5.5 => 6
1.1 => 2
-1.1 => -2
-1.6 => -2
问题
- BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)
解决方法:给divide设置精确的小数点
JavaMoney(第三方)
[转]BigDecimal使用(整理)的更多相关文章
- BigDecimal使用整理
BigDecimal使用整理 一. BigDecimal简介 计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigD ...
- BigDecimal相关整理
bigdecimal类型四则运算: BigDecimal s = new Bigdecimal(5); BigDecimal x = new Bigdecimal(15); 依次为最基础的加减乘除: ...
- B/S系统常见缺陷整理和解决方案
最近部门整理了今年所有项目测试团队提出的BUG,筛选了几十个作为常规通用的缺陷,我根据这些缺陷内容,去掉和业务相关的知识,整理出了一份缺陷描述和解决方案. 其实WEB系统中常规的缺陷分类后也就那么多, ...
- Sonar 常用代码规则整理(二)
摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ============ ...
- Java基础语法<五> 大数值BigInteger BigDecimal
笔记整理 来源于<Java核心技术卷 I > <Java编程思想> 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有平有用的类:BigIn ...
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- 【整理】Java 8新特性总结
闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...
- 单元测试系列之十:Sonar 常用代码规则整理(二)
摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...
- Java多线程面试题整理
部分一:多线程部分: 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...
随机推荐
- Django admin 页面中文名称加s,去除s的设置
class UserInfo(models.Model): #字段 #字段 #字段 class Meta: verbose_name_plural = '用户列表'
- XSLT知识点【一】
XSL 指扩展样式表语言(EXtensible Stylesheet Language). 它起始于 XSL,结束于 XSLT.XPath 以及 XSL-FO. 起始于 XSL------CSS = ...
- 使用CIFAR-10样本数据集测试卷积神经网络(ConvolutionalNeuralNetwork,CNN)
第一次将例程跑起来了,有些兴趣. 参考的是如下URL: http://www.yidianzixun.com/article/0KNz7OX1 本来是比较Keras和Tensorflow的,我现在的水 ...
- 使用Jackson的@JsonFormat注解时出现少了 8 个小时
比如数据库存的日期是2018-01-05,转成json则变成了2018-01-04 解决办法: @JsonFormat(pattern="yyyy-MM-dd") public D ...
- python 赋值与深浅拷贝
https://www.cnblogs.com/Eva-J/p/5534037.html
- dedecms列表页使用noflag
最近小编使用dedecms遇到列表页需要使用noflag,在网上找了一圈都是直接替换代码,试用了一下并不能解决问题. 以下是小编自己根据资料整理的...多说一句由于各个编辑器打开的方式可能代码不在这一 ...
- 使用bufio包和函数式变成实现类似python生成器效果
package main import ( "bufio" "fmt" "io" "strings" ) type in ...
- Spring入门(一)——IOC
1. IOC定义 Inversion of Control,减低计算机代码间的耦合度,对象的创建交给外部容器完成,不用再new了 2. 流程 2.1 创建Bean对象 package bean; pu ...
- A tow-day exam
D1 T1l \(des:\) 给出一棵树,判断树上两条路径是否相交 \(sol:\) 判断其中一条路径的两个端点以及两端点的 \(lca\) 是否存在于另一条链上 由于这是一棵树,任一点为根后这样判 ...
- 一个简单的setTimeout的问题
经常使用 setTimeout,并且自己认为也算比较熟悉这个函数的用法. 不过今天碰到了,突然发现自己没有意识到这个问题.于是作为一个记录点,进行巩固一下. var timer = window.se ...