BigDecimal通常在涉及到精确计算的时候会用到,下面是自己多次错误使用BigDecimal的总结。

结论:

  1. BigDecimal初始化小数时,尽量用字符串形式,例如new BigDecimal("0.1");
  2. BigDecimal类型变量比较大小时用compareTo方法,判断变量值是否为0,与BigDecimal.ZERO比较大小。
  3. 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
}
结论:尽量用字符串的形式初始化,因为小数在计算机内部根本没法精确表示。 
 

比较大小

比较BigDecimal类型的变量和0的大小,用compareTo,不要用equals:
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+" 【相等】");
}
}
结论:比较大小或者值是否相等,用compareTo方法
 

BigDecimal除法

在出现除不尽的时候,会出现问题,例如1/3的问题:
//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精确计算及陷阱的更多相关文章

  1. BigDecimal精确计算工具类

    前言 在实际开发中,遇到例如货币,统计等商业计算的时候,一般需要采用java.math.BigDecimal类来进行精确计算.而这类操作通常都是可预知的,也就是通用的.所以,写了个工具类来方便以后的工 ...

  2. Java使用BigDecimal精确计算的简单公式计算器

    由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法, ...

  3. 运用BigDecimal精确计算

    package com.wzh.test; import java.math.BigDecimal; public class test { /** * @param args */ public s ...

  4. Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

    (转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...

  5. JAVA中精确计算金额BigDecimal

    package com.chauvet.utils; import java.math.BigDecimal; import java.text.DecimalFormat; import java. ...

  6. 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算

    1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...

  7. 电商网站中价格的精确计算(使用BigDecimal进行精确运算(实现加减乘除运算))

    使用BigDecimal的String的构造器.商业计算中,使用bigdecimal的String构造器,一定要用. 重要的事情说三遍: 商业计算中,使用bigdecimal的String构造器! 商 ...

  8. Java使用BigDecimal解决精确计算的问题

    最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解 ...

  9. Java精确计算小数

    Java在计算浮点数的时候,由于二进制无法精确表示0.1的值(就好比十进制无法精确表示1/3一样),所以一般会对小数格式化处理. 但是如果涉及到金钱的项目,一点点误差都不能有,必须使用精确运算的时候, ...

随机推荐

  1. C# 中的 ConfigurationManager类引用方法应用程序配置文件App.config的写法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  2. Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法

    当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为, ...

  3. Entity Framework Core 软删除与查询过滤器

    本文翻译自<Entity Framework Core: Soft Delete using Query Filters>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意 ...

  4. 判断DataRow中是否包含某列

    DataRow dr = new DataRow(); if (dr!=null && dr.Table.Columns.Contains("errormesg") ...

  5. Out of mind - 魔术纸

    魔术纸 显示屏与纸张的完美结合.类似电子墨水.柔性显示器.魔术纸柔软似真正的纸张.用魔术纸做成的电子书,控制器在书轴处. 每一页能显示不同的东西.一本书可以完全按页显示在电子书上.可以换一本书来显示. ...

  6. Hadoop的配置过程(虚拟机中的伪分布模式)

    1引言 hadoop如今已经成为大数据处理中不可缺少的关键技术,在如今大数据爆炸的时代,hadoop给我们处理海量数据提供了强有力的技术支撑.因此,了解hadoop的原理与应用方法是必要的技术知识. ...

  7. 学习笔记TF031:实现VGGNet

    VGGNet,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发,深度卷积神经网络.VGGNet反复堆叠3x3小型卷积核和2x2最大池化层, ...

  8. 替换Spring Boot 的EnableCaching注解

    SpringBoot 中可使用@Cacheable注解来更方便的使用redis,这个注解是通过拦截器工作的,使用了@Cacheable的方法执行时,执行到CglibAopProxy.java中的 Dy ...

  9. python函数(3):装饰器

    昨天学了很多函数方面的概念和知识其中有一个闭包的函数.很多人都对闭包的作用不是很清楚,今天我们就来认识一个新的知识点装饰器.它就是闭包函数的一个经典应用. 预习: 编写装饰器,为多个函数加上认证的功能 ...

  10. .net 自动分类算法【原创】

    目前自动分类算法是参考网上的思路和想法个人自主研发的. 当然互联网上有很多人采用不同的方式去解决自动分类问题,也有不同的算法和论文支持去做,但纵观自动分类这块工作是属于机器学习这块工作内容,总结出来比 ...