一、前言

  在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。

二、利用BigDecimal进行运算

/**   * 对double数据进行取精度.   * @param value  double数据.   * @param scale  精度位数(保留的小数位数).   * @param roundingMode  精度取值方式.   * @return 精度计算后的数据.   */   public static double round(double value, int scale,  int roundingMode) {    BigDecimal bd = new BigDecimal(value);    bd = bd.setScale(scale, roundingMode);    double d = bd.doubleValue();    bd = null;    return d;    }    /** * double 相加 * @param d1 * @param d2 * @return */ public double sum(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.add(bd2).doubleValue(); } /** * double 相减 * @param d1 * @param d2 * @return */ public double sub(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.subtract(bd2).doubleValue(); } /** * double 乘法 * @param d1 * @param d2 * @return */ public double mul(double d1,double d2){ BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.multiply(bd2).doubleValue(); } /** * double 除法 * @param d1 * @param d2 * @param scale 四舍五入 小数点位数 * @return */ public double div(double d1,double d2,int scale){ //  当然在此之前,你要判断分母是否为0,    //  为0你可以根据实际需求做相应的处理
BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.divide  (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } 

三、BigDecimal的8种舍入模式

在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。
1、ROUND_UP
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
2、ROUND_DOWN
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。
3、ROUND_CEILING
接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。
4、ROUND_FLOOR
接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。
5、ROUND_HALF_UP
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

转载于:https://www.cnblogs.com/flydkPocketMagic/p/7449150.html

【Java】BigDecimal相关推荐

  1. 【Java】BigDecimal.setScale用法总结

    BigDecimal.setScale主要用于对BigDecimal数据小数点后的位数进行 进位.舍位.截断等操作 BigDecimal使用说明 1. 不建议,会造成精度损失 BigDecimal n ...

  2. setscale方法的用法_【java】BigDecimal.setScale用法总结

    ====================写法======================== 1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不 ...

  3. 【Java】eclipse如何导入项目

    [Java]eclipse如何导入项目 1.第一步,打开eclipse,点击file->import 2.第二步,选择general->existing projects into wor ...

  4. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  5. 【Java】泛型中 extends 和 super 的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  6. java反射invoke空指针_【Java】Java 反射 object is not an instance of declaring cla

    [Java]Java 反射 object is not an instance of declaring cla [Java]Java 反射 object is not an instance of ...

  7. synchronized【Java】中使用的demo

    synchronized[Java]中使用的demo 没有synchronized的效果: package Action;public class syn {static int count=10;s ...

  8. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  9. LeetCode题库整理【Java】—— 3 无重复字符的最长子串

    LeetCode题库整理[Java] ## 3 无重复字符的最长子串 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" ...

最新文章

  1. maven 使用 问题记录
  2. 7.2 DOM方法(以动态方式实时创建标记,实质在改变DOM节点树)
  3. 百会CRM教你在大数据平台中做精准营销
  4. java utf 8 转unicode_java 在Unicode和UTF-8之间转换
  5. 干货|吴恩达Coursera课程教你学习神经网络!
  6. POJ-1050 To the Max 二维最大子段和
  7. 数据库中字段类型Number(n,m)大概说明
  8. Linux_基础_软件包管理
  9. miniUI mini-monthpicker ie8兼容性问题
  10. SpringBoot优缺点总结
  11. 「开源资讯」Sentinel Go 0.4.0 发布,支持热点流量防护能力
  12. Oracle 数据文件迁移过程中 执行 shartup mount 报ORA03113:通讯通道的文件结尾 问题解决过程
  13. 数据库课程设计银行管理系统(SQL Server)
  14. arduino(2560)与步进电机驱动器连线
  15. 分享一款免费刷相关搜索、联想下拉推荐、网页快照排名的软件
  16. 梅花雪MzTreeView2.0 的checkbox完全攻略
  17. Mac重启和关机没反应解决办法
  18. 如何设置,QQ邮箱新版界面
  19. IP核的使用之ROM(Vivado)
  20. postman设置前置条件

热门文章

  1. 移植Linux3.4.2版本内核到mini2440
  2. PHP聊天记录内啥,PHP的PSR系列轨范都有啥内容
  3. python io操作需要用到什么硬件_Python I/O 操作(一)
  4. SQLServer书写规范梳理
  5. 数据库系统工程师考点分析
  6. VS Code的7个开源替代品,值得推荐!
  7. 分享几个路由器设置小技巧,总有用得到的一天!
  8. 数据结构 二、向量(接口与实现and可扩容向量)
  9. 荒径 弗罗斯特_弗罗斯特庞克,颠覆性城市建设者
  10. repomd.xml错误14 not found