BigDecimal精确计算及陷阱
BigDecimal通常在涉及到精确计算的时候会用到,下面是自己多次错误使用BigDecimal的总结。
结论:
- BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal("0.1");
- BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。
- BigDecimal作除法时,除了要考虑除数是否为0,更要考虑是否能除尽的问题,直接调用BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)方法做除法可以避免除不尽的问题。
初始化BigDecimal变量:
//BigDecimal初始化
public static void testBigDecimalinit() {
BigDecimal num1 = new BigDecimal(0.1);
System.out.println("坑点1:num1="+num1);//坑点1:num1=0.1000000000000000055511151231257827021181583404541015625 BigDecimal num2 = new BigDecimal("0.1");
System.out.println("正确写法:num2="+num2);//正确写法:num2=0.1
}
比较大小
if (num1.compareTo(BigDecimal.ZERO)>0)
if (num1.compareTo(BigDecimal.ZERO)<0)
if (num1.compareTo(BigDecimal.ZERO)==0)
//比较大小
public static void testBigDecimalCompareTo() {
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.100"); if (!num1.equals(num2)) {
System.out.println("坑点1,用equals比较大小,num1="+num1+", num2="+num2+" 【不相等】");
}
if (!(num1 == num2)) {
System.out.println("坑点2,用==运算符比较大小,num1="+num1+", num2="+num2+" 【不相等】");
} if (num1.compareTo(num2) == 0) {
System.out.println("正确比较大小,用compareTo,num1="+num1+", num2="+num2+" 【相等】");
}
}
BigDecimal除法
//BigDecimal除法
public static void testBigDecimalDivide() {
BigDecimal num1 = new BigDecimal("1");
//坑点:Exception in thread "main" java.lang.ArithmeticException: Non-terminating decima l expansion; no exact representable decimal result.
// System.out.println("坑点写法1:"+num1.divide(new BigDecimal("3")));
// System.out.println("坑点写法2:"+num1.divide(new BigDecimal("3")).setScale(2, BigDecimal.ROUND_DOWN)); System.out.println("正确写法:"+num1.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_DOWN));
}
结论:只有在divide的时候就设置好要精确的小数位数和舍入模式,才能避免出现无法精确表达除不尽的问题。
BigDecimal精确计算及陷阱的更多相关文章
- BigDecimal精确计算工具类
前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...
- Java使用BigDecimal精确计算的简单公式计算器
由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...
- 运用BigDecimal精确计算
package com.wzh.test; import java.math.BigDecimal; public class test { /** * @param args */ public s ...
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- JAVA中精确计算金额BigDecimal
package com.chauvet.utils; import java.math.BigDecimal; import java.text.DecimalFormat; import java. ...
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- 电商网站中价格的精确计算(使用BigDecimal进行精确运算(实现加减乘除运算))
使用BigDecimal的String的构造器.商业计算中,使用bigdecimal的String构造器,一定要用. 重要的事情说三遍: 商业计算中,使用bigdecimal的String构造器! 商 ...
- Java使用BigDecimal解决精确计算的问题
最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解 ...
- Java精确计算小数
Java在计算浮点数的时候,由于二进制无法精确表示0.1的值(就好比十进制无法精确表示1/3一样),所以一般会对小数格式化处理. 但是如果涉及到金钱的项目,一点点误差都不能有,必须使用精确运算的时候, ...
随机推荐
- jsp,2016.11.28
1,在jsp中要关联到js的时候就要导入js才可以调用到js <!-- 导入地区的js --> <script type="text/javascript" sr ...
- LInux基础命令分类
1. 命令的概念 命令的执行过程 系统第一次执行外部命令时Hash缓存表为空,系统会先从PTAH路径下寻找命令,找到后会将路径加入到Hasa缓存中,当再次执行此命令时会直接从Hash的路径下执行,如果 ...
- IScroll那些事——内容不足时下拉刷新
之前项目中的列表是采用的IScroll,但是在使用IScroll有一个问题就是:当内容不足全屏的时候,是木有办法往下拉的,这样就达不到刷新的目的了.[这是本人工作中遇到的,具体例子具体分析,这里只作一 ...
- Es6 新增函数
====函数的扩展 -----ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...
- AOP in dotnet :AspectCore的参数拦截支持
距离上一篇AspectCore的介绍发布已经很长一段时间了,这篇文章也早该和大家见面,最近一直忙于适应新工作,并在业余时间有幸向何镇汐,Savorboard,农夫,AlexLEWIS等几位大牛请教学习 ...
- 常用的DNS
中国互联网络中心(推荐,安全又快速):1.2.4.8.210.2.4.8.101.226.4.6(电信及移动).123.125.81.6(联通)阿里DNS:223.5.5.5.223.6.6.6goo ...
- CSS外边距合并问题
今天无意中碰到了外边距合并的问题,于是便研究了一下.这里做个笔记. 所谓外边距合并,指的是当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者. ...
- Vue.js之深入浅出
介绍引言 Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上 ...
- IDEA 单元测试testng入门及testng.xml
直接进入正题: 1.TestNG的运行方式如下: With a testng.xml file 直接run as test suite With ant 使用ant From the command ...
- WMvare桥接模式固定IP
一.命令行固定IP 1.配置网卡IP地址 在命令行输入"vi /etc/sysconfig/network-scripts/ifcfg-eth0"#eth0为第一块网卡,如果是第二 ...