Java的BigDecimal容易出现的坑
2024-09-28 17:48:15
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)
在第二个或者第三个构造方法中,指定了当除不尽的时候,进行有效位数的保留,因此会比较安全。
在此推荐大家使用这个方法的时候 使用第三个方法,比较安全。
最新文章
- Android Studio Jni 环境搭建
- redis基本配置和相关设置
- RPC框架DUBBO
- SharePoint 2013 调用WCF服务简单示例
- 【原创】express3.4.8源码解析之路由中间件
- SGU 187 - Twist and whirl -- want to cheat
- QT UI 使一个QWidget里面的元素自动填充满本QWidget
- linux进程通信之信号
- 【Egret】实现web页面操作PC端本地文件操作
- 盒子浮动float
- Fiddler使用~知多少?
- 联想扬天3900c电脑BIOS设置U盘启动图文教程
- 在Java中使用Socket模拟客户端和服务端(多线程)
- 利用SurfaceView显示正弦曲线,仿造示波器
- C语言第十二讲,文件操作.
- zabbix学习-如何部署一个agent客户端
- 关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题
- producter-consumer 他山之石
- 由于html元素加载导致的问题
- linux-*.filetype.bz2 unzip