文章链接:https://liuyueyi.github.io/hexblog/2018/06/15/180615-精度计算BigDecimal/

180615-精度计算BigDecimal

目前接触的业务中,对数据的精度要求比较高,因此不再使用基本的float,double,改为用BigDecimal进行存储和相关的计算,端午前的这一篇博文,则简单的介绍下BigDecimal的使用姿势,早点回家早点放假

<!-- more -->

I. 基本使用

1. 构造方法

几个常见的构造方式,将基本类型+String等,转换为BigDecimal对象

public BigDecimal(char[] in);
public BigDecimal(String val);
public BigDecimal(BigInteger val);
public BigDecimal(int val);
public BigDecimal(long val);
public BigDecimal(double val)

2. 加减乘除

public BigDecimal add(BigDecimal value);                        //加法public BigDecimal subtract(BigDecimal value);                   //减法 public BigDecimal multiply(BigDecimal value);                   //乘法public BigDecimal divide(BigDecimal value);                     //除法

从上面的签名上,可以看出操作是属于链式结构(Builder模式),然后一个问题就是执行上面的操作之后,被调用的对象,是否会发生修改? (即下面的测试中的o值是否改变)

@Test
public void testBigDecimal() {BigDecimal o = new BigDecimal(11.1);BigDecimal d = new BigDecimal(1);System.out.println(o.add(d) + "| " + o);
}

输出结果

12.0999999999999996447286321199499070644378662109375| 11.0999999999999996447286321199499070644378662109375

结论: 计算后的结果需要保存,因为不会修改目标对象的值

3. 精度

前面的例子中,输出后面一长串,而这往往并不是我们希望的,所以可以设置下精度

public BigDecimal setScale(int newScale, RoundingMode roundingMode);

一个简单的case如下

@Test
public void testBigDecimal() {BigDecimal o = new BigDecimal(11.1);System.out.println(o.setScale(3, RoundingMode.CEILING) + "| " + o);
}

输出

11.100| 11.0999999999999996447286321199499070644378662109375

从上面的输出,特别是第二列,如果我们选择的精度方式是取下限,会不会有问题呢?

@Test
public void testBigDecimal() {BigDecimal o = new BigDecimal(11.1);System.out.println(o.setScale(1, RoundingMode.FLOOR) + "| " + o);
}

输出结果为:

11.0| 11.0999999999999996447286321199499070644378662109375

所以需要注意的地方就来了,对浮点数进行精度设置时,需要根据自己的业务场景,选择合适的取整方式,不然很容易出问题

取精度的几个参数说明

ROUND_CEILING    //向正无穷方向舍入
ROUND_DOWN    //向零方向舍入
ROUND_FLOOR    //向负无穷方向舍入
ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
ROUND_UP    //向远离0的方向舍入

II. 其他

1. 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog
  • QQ: 一灰灰/3302797840

3. 扫描关注

180615-精度计算BigDecimal相关推荐

  1. Java黑皮书课后题第10章:*10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal

    10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal 题目 首次尝试 代码 运行 关于揪bug 第二次尝试 代码 运行结 ...

  2. Android 金钱计算BigDecimal 的使用

    今天做了一个购物车的功能 ,设计到了钱的计算,使用到了BigDecimal 晚上回来总结下 这个BigDecimal 计算钱呢很好用 其主要有 1 add 加法 2 subtract 减法 3 mul ...

  3. 科普 | 单精度、双精度、多精度和混合精度计算的区别是什么?

    科普 | 单精度.双精度.多精度和混合精度计算的区别是什么? 转自:https://zhuanlan.zhihu.com/p/93812784 我们提到圆周率 π 的时候,它有很多种表达方式,既可以用 ...

  4. 精度计算——大数阶乘

    精度计算--大数阶乘 摘自一个 ACM函数模板 ,学习记录自己的理解(^U^)ノ~YO 语法:int result=factorial(int n) 参数:n: n的阶乘 返回值:阶乘的结果 注意: ...

  5. PHP 精度计算问题(精确算法)

    1. PHP 中的精度计算问题 当使用 php 中的 +-*/ 计算浮点数时, 可能会遇到一些计算结果错误的问题 这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 j ...

  6. php的精度计算问题(bcadd和bcsub)

    一.前言 我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算.当小数点的位数比较多的时候,往往容易犯一些很低级的错误.这里记录一下php的精度计算和封装的小d ...

  7. 在计算机领域,半精度、单精度、双精度的定义,以及多精度计算和混合精度计算的区别。

    在计算机系统的内存中,半精度是16bit,单精度是32bit,双精度是64bit. signed bit符号位,有效数字的符号位 Exponent 阶码或者叫指数,以10^Exponent表示 Sig ...

  8. python单精度和双精度_单精度、双精度、多精度和混合精度计算的区别是什么?...

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 编排 | strongerHuang 微信公众号 | 嵌入式专栏 我们学过数学,都知 ...

  9. BigDecimal类(精度计算类)的加减乘除

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...

最新文章

  1. Java Web servletRequest
  2. eye care staff
  3. equals, hashCode, toString方法重写,深入探究equals
  4. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...
  5. 预约购票 php,正式上线!预约购票、参访攻略...你最关心的都在这!
  6. 有人说苹果手机的CPU非常强大,为什么会这样?苹果cpu又是谁设计的?
  7. jQuery的创建对象,动态添加、修改、删除属性和方法
  8. 跟我一起来用C++写Web服务器吧
  9. java+log4j+是异步吗_log4j2用asyncRoot配置异步日志是如何使用disruptor
  10. a20 linux qt,全志A83T开发板,超树莓派/A20/A31S/banana pi M3/八核/Android5
  11. 24位RGB颜色与16位RGB颜色的转换
  12. 关于音频情感分类的随笔(3)
  13. Python批量快速合并excel文件
  14. 转载:SyncToy安装使用详解
  15. Windows下Zookeeper启动zkServer.cmd报错闪退,找不到zoo.cfg文件
  16. [曲苑杂谈]mac\windows phpstorm快捷键
  17. 外贸公司怎么群发邮件?群发邮件邮箱怎么发更高效?
  18. 自动驾驶平台Apollo 2.5环境搭建
  19. JavaScript中关于滚动scrollBy()与scrollTo()的区别
  20. 开源CMS框架整理收集

热门文章

  1. 一文读懂AlphaGo背后的强化学习:它的背景知识与贝尔曼方程的原理
  2. 还在用分页?你out了 !试试 MyBatis 流式查询,真心强大!
  3. 程序员缺乏经验的 7 种表现!
  4. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
  5. LeetCode刷题指南!
  6. 90%的人会遇到性能问题,如何用1行代码快速定位?
  7. ELECTRA: 超越BERT, 19年最佳NLP预训练模型
  8. Datawhale入选DataFountain优秀组织
  9. 2021 年 7 月编程语言排行榜
  10. 90 后女科学家,四年完成清华大学硕博连读,解决多个世界级难题