BigDecimal一般是用来做要求比较高的精准计算的。前几天在使用的时候遇到一个大坑,记录下。

这个问题产生是使用BigDecimal做除法(divide)运算,这个类的divide方法存在三个常用的构造函数。

BigDecimal divide(BigDecimal divisor) 
          Returns a BigDecimal whose value is (this / divisor), and whose preferred scale is (this.scale() - divisor.scale()); if the exact quotient cannot be represented (because it has a non-terminating decimal expansion) an ArithmeticException is thrown.
 BigDecimal divide(BigDecimal divisor, int roundingMode) 
          Returns a BigDecimal whose value is (this / divisor), and whose scale is this.scale().
 BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 
          Returns a BigDecimal whose value is (this / divisor), and whose scale is as specified.

在第一个构造方法中,可以只传入被除数(divisor)。但是调用这个方法极容易出现一个错误,当除不尽时候,会产生无限循环小数,这时将会抛出异常:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

at java.math.BigDecimal.divide(BigDecimal.java:1690)

在第二个或者第三个构造方法中,指定了当除不尽的时候,进行有效位数的保留,因此会比较安全。

在此推荐大家使用这个方法的时候  使用第三个方法,比较安全。

最新文章

  1. Android Studio Jni 环境搭建
  2. redis基本配置和相关设置
  3. RPC框架DUBBO
  4. SharePoint 2013 调用WCF服务简单示例
  5. 【原创】express3.4.8源码解析之路由中间件
  6. SGU 187 - Twist and whirl -- want to cheat
  7. QT UI 使一个QWidget里面的元素自动填充满本QWidget
  8. linux进程通信之信号
  9. 【Egret】实现web页面操作PC端本地文件操作
  10. 盒子浮动float
  11. Fiddler使用~知多少?
  12. 联想扬天3900c电脑BIOS设置U盘启动图文教程
  13. 在Java中使用Socket模拟客户端和服务端(多线程)
  14. 利用SurfaceView显示正弦曲线,仿造示波器
  15. C语言第十二讲,文件操作.
  16. zabbix学习-如何部署一个agent客户端
  17. 关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题
  18. producter-consumer 他山之石
  19. 由于html元素加载导致的问题
  20. linux-*.filetype.bz2 unzip

热门文章

  1. maven - 安装目录详解
  2. docker Mac安装和使用
  3. Tinghua Data Mining 8
  4. Django 使用allauth报错
  5. 记住,永远不要在MySQL中使用“utf8”-转
  6. P1051 谁拿了最多奖学金——水题
  7. h5旋转效果
  8. mint 有线网络未管理的解决
  9. linux下mysql中文乱码
  10. python第一模块基础语法