Non-terminating decimal expansion; no exact representable decimal result. 的恩恩怨怨
问题描述
在工作中,使用到BigDecimal类进行除法运算,结果系统在运行的过程中,发生了如下错误信息:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.at java.math.BigDecimal.divide(BigDecimal.java:1693)
翻译成中文的大体意思是没有终止的decimal 扩张,没有确切的可表达的deciaml结果。
翻译成人话就是除不尽。示例代码如下
BigDecimal divide = new BigDecimal(list.size).divide(new BigDecimal(slices));
说明list.size 除以slices 无法除尽。是不是这个原因呢?我们来做一个实验,看下面的代码:
BigDecimal divide = new BigDecimal(20).divide(new BigDecimal(3));
运行后,果然抛上面的错误。
将参数修改成
BigDecimal divide = new BigDecimal(20).divide(new BigDecimal(4));
运行后得到结果 5。说明就是这个问题,那么如何解决呢?
解决方式
既然是因为除不尽导致的,那么我们在除的时候指定进位方式:根据实际业务选择对应的进位方式
BigDecimal divide = new BigDecimal(22).divide(new BigDecimal(4), RoundingMode.UP);
进位方式
1、RoundingMode.ROUND_UP:只要小数位不等于0,无条件向上取整(与向大取整不同)
官方给的例子如下:
<table>
<tr align=right><td>5.5</td> <td>6</td>
<tr align=right><td>2.5</td> <td>3</td>
<tr align=right><td>1.6</td> <td>2</td>
<tr align=right><td>1.1</td> <td>2</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-2</td>
<tr align=right><td>-1.6</td> <td>-2</td>
<tr align=right><td>-2.5</td> <td>-3</td>
<tr align=right><td>-5.5</td> <td>-6</td>
</table>
2、RoundingMode.ROUND_DOWN:与向上取整相反,向下取整
<table>
<tr align=right><td>5.5</td> <td>5</td>
<tr align=right><td>2.5</td> <td>2</td>
<tr align=right><td>1.6</td> <td>1</td>
<tr align=right><td>1.1</td> <td>1</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-1</td>
<tr align=right><td>-1.6</td> <td>-1</td>
<tr align=right><td>-2.5</td> <td>-2</td>
<tr align=right><td>-5.5</td> <td>-5</td>
</table>
3、RoundingMode.ROUND_CEILING:向大取整,意思是向大的方向取整
<table>
<tr align=right><td>5.5</td> <td>6</td>
<tr align=right><td>2.5</td> <td>3</td>
<tr align=right><td>1.6</td> <td>2</td>
<tr align=right><td>1.1</td> <td>2</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-1</td>
<tr align=right><td>-1.6</td> <td>-1</td>
<tr align=right><td>-2.5</td> <td>-2</td>
<tr align=right><td>-5.5</td> <td>-5</td>
</table>
4、RoundingMode.ROUND_FLOOR:向小的方向取整
<table>
<tr align=right><td>5.5</td> <td>5</td>
<tr align=right><td>2.5</td> <td>2</td>
<tr align=right><td>1.6</td> <td>1</td>
<tr align=right><td>1.1</td> <td>1</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-2</td>
<tr align=right><td>-1.6</td> <td>-2</td>
<tr align=right><td>-2.5</td> <td>-3</td>
<tr align=right><td>-5.5</td> <td>-6</td>
</table>
5、RoundingMode.ROUND_HALF_UP:半向相邻的方向取整,与哪个整数近,取哪个,0.5向上取整,如果是正数,0.5向大取整,如果是负数,0.5向小取整
<table>
<tr align=right><td>5.5</td> <td>6</td>
<tr align=right><td>2.5</td> <td>3</td>
<tr align=right><td>1.6</td> <td>2</td>
<tr align=right><td>1.1</td> <td>1</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-1</td>
<tr align=right><td>-1.6</td> <td>-2</td>
<tr align=right><td>-2.5</td> <td>-3</td>
<tr align=right><td>-5.5</td> <td>-6</td>
</table>
6、RoundingMode.ROUND_HALF_DOWN:半向相邻的方向取整,与哪个整数近,取哪个,0.5向下取整,如果是正数,0.5向小取整,如果是负数,0.5向大取整
<table>
<tr align=right><td>5.5</td> <td>5</td>
<tr align=right><td>2.5</td> <td>2</td>
<tr align=right><td>1.6</td> <td>2</td>
<tr align=right><td>1.1</td> <td>1</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-1</td>
<tr align=right><td>-1.6</td> <td>-2</td>
<tr align=right><td>-2.5</td> <td>-2</td>
<tr align=right><td>-5.5</td> <td>-5</td>
</table>
7、RoundingMode.ROUND_HALF_EVEN:半偶数取整,主要针对半数0.5来说,向偶数取整
<table>
<tr align=right><td>5.5</td> <td>6</td>
<tr align=right><td>2.5</td> <td>2</td>
<tr align=right><td>1.6</td> <td>2</td>
<tr align=right><td>1.1</td> <td>1</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>-1</td>
<tr align=right><td>-1.6</td> <td>-2</td>
<tr align=right><td>-2.5</td> <td>-2</td>
<tr align=right><td>-5.5</td> <td>-6</td>
</table>
8、RoundingMode.ROUND_UNNECESSARY:如果是小数则抛出异常
<table>
<tr align=right><td>5.5</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>2.5</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>1.6</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>1.1</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>1.0</td> <td>1</td>
<tr align=right><td>-1.0</td> <td>-1</td>
<tr align=right><td>-1.1</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>-1.6</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>-2.5</td> <td>throw {@code ArithmeticException}</td>
<tr align=right><td>-5.5</td> <td>throw {@code ArithmeticException}</td>
</table>
在代码中找到commonNeedIncrement方法,用来 判断是否需要进位
private static boolean commonNeedIncrement(int roundingMode, int qsign,int cmpFracHalf, boolean oddQuot) {switch(roundingMode) {case ROUND_UNNECESSARY:throw new ArithmeticException("Rounding necessary");case ROUND_UP: // Away from zeroreturn true;case ROUND_DOWN: // Towards zeroreturn false;case ROUND_CEILING: // Towards +infinityreturn qsign > 0;case ROUND_FLOOR: // Towards -infinityreturn qsign < 0;default: // Some kind of half-way roundingassert roundingMode >= ROUND_HALF_UP &&roundingMode <= ROUND_HALF_EVEN: "Unexpected rounding mode" + RoundingMode.valueOf(roundingMode);if (cmpFracHalf < 0 ) // We're closer to higher digitreturn false;else if (cmpFracHalf > 0 ) // We're closer to lower digitreturn true;else { // half-wayassert cmpFracHalf == 0;switch(roundingMode) {case ROUND_HALF_DOWN:return false;case ROUND_HALF_UP:return true;case ROUND_HALF_EVEN:return oddQuot;default:throw new AssertionError("Unexpected rounding mode" + roundingMode);}}}}
Non-terminating decimal expansion; no exact representable decimal result. 的恩恩怨怨相关推荐
- java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal res
转载自:https://www.cnblogs.com/LeoBoy/p/5897754.html 今天在写一个JAVA程序的时候出现了异常:java.lang.ArithmeticException ...
- Non-terminating decimal expansion; no exact representable decimal result。
使用 Bigdecimal 做除法,除不尽时 JDK1.7 会报错. Non-terminating decimal expansion; no exact representable decimal ...
- Non-terminating decimal expansion; no exact representable decimal res
在使用BigDecimal做出发运算时,如果没有指定小数点位数,在除不尽的时候,就会出现java.lang.ArithmeticException: Non-terminating decimal e ...
- Java中BigDecimal异常Non-terminating decimal expansion; no exact representable decimal result
异常描述: Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal ex ...
- Non-terminating decimal expansion; no exact representable decimal result
Non-terminating decimal expansion; no exact representable decimal result 这种异常是由于用BIgDecimal做divide(除 ...
- Non-terminating decimal expansion; no exact representable decimal result异常
Non-terminating decimal expansion; no exact representable decimal result 翻译:无法终止小数点扩展; 没有确切的可表示的小数结果 ...
- 错误描述:Non-terminating decimal expansion; no exact representable decimal result.
错误描述:Non-terminating decimal expansion; no exact representable decimal result. 在做电子发票部分要计算计税额,基本是Big ...
- 解决:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如下: java.lang.ArithmeticException: Non-terminati ...
- java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal
今天实际开发中碰到这个报错: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representa ...
最新文章
- java中ajax概念_Java之AJAX概念和实现方式
- Python基础总结(5)
- python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...
- 说说那些死于决斗的大牛
- 中国内窥镜光学物镜市场趋势报告、技术动态创新及市场预测
- 别再对 Istio 一脸懵了,万众期待的第一本 Istio 著作现!已!上!市
- maven依赖c3p0_springboot 使用c3p0数据库连接池的方法
- 抢占云安全管理高地 启明星辰先发云SOC
- ubuntu中安装hp惠普打印机
- 服务器维修工程师个人简历,机械维修工程师个人简历模板精选
- cad,max,revit,Civil ,InventorNavisworks 卸载清理工具
- xlsxwriter去掉网格线_xlsxwriter图表网格间距
- hive presto sql从身份证号提取年龄和性别
- 用matlab求二重积分
- 5类人最适合做程序员,你属于哪一类?
- 衡量度量过程性能的几个指标
- 记一次安装 ubuntu 18.04 双系统 (双硬盘)
- day79_babasport第五天
- 2022第十一届PMO大会日程已定,将于8月13-14日和20-21日线上召开
- 男人应该做的50件事(17-33)
热门文章
- 博士毕业于浸会大学计算机系,香港浸会大学童铁军博士为计算机与信息学院师生作学术报告...
- AI安全---对抗攻击防御措施
- linux-lsmod、lspci命令释义
- CSDN开会员了,你怎么想?----高级
- 自己标注数据集训练基于pytorch3.7的yolov5手掌识别模型
- 【java】商城进货交易记录程序设计
- mysql (errcode 28)_MySQL出现Errcode:28错误提示解决办法
- 每周一个前端动画之四:掘金头像旋转动画
- Centos6.5 安装 RabbitMQ3.6.1
- 基于嵌入式STT-MRAM的架构方案