博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java】BigDecimal
阅读量:5317 次
发布时间:2019-06-14

本文共 3105 字,大约阅读时间需要 10 分钟。

一、前言

  在使用,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.28、ROUND_UNNECESSARY断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

 

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

你可能感兴趣的文章
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
Java面向对象重要关键字
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>