问题描述

在工作中,使用到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. 的恩恩怨怨相关推荐

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

    转载自:https://www.cnblogs.com/LeoBoy/p/5897754.html 今天在写一个JAVA程序的时候出现了异常:java.lang.ArithmeticException ...

  2. Non-terminating decimal expansion; no exact representable decimal result。

    使用 Bigdecimal 做除法,除不尽时 JDK1.7 会报错. Non-terminating decimal expansion; no exact representable decimal ...

  3. Non-terminating decimal expansion; no exact representable decimal res

    在使用BigDecimal做出发运算时,如果没有指定小数点位数,在除不尽的时候,就会出现java.lang.ArithmeticException: Non-terminating decimal e ...

  4. Java中BigDecimal异常Non-terminating decimal expansion; no exact representable decimal result

    异常描述: Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal ex ...

  5. Non-terminating decimal expansion; no exact representable decimal result

    Non-terminating decimal expansion; no exact representable decimal result 这种异常是由于用BIgDecimal做divide(除 ...

  6. Non-terminating decimal expansion; no exact representable decimal result异常

    Non-terminating decimal expansion; no exact representable decimal result 翻译:无法终止小数点扩展; 没有确切的可表示的小数结果 ...

  7. 错误描述:Non-terminating decimal expansion; no exact representable decimal result.

    错误描述:Non-terminating decimal expansion; no exact representable decimal result. 在做电子发票部分要计算计税额,基本是Big ...

  8. 解决:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 报错如下: java.lang.ArithmeticException: Non-terminati ...

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

    今天实际开发中碰到这个报错: java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representa ...

最新文章

  1. java中ajax概念_Java之AJAX概念和实现方式
  2. Python基础总结(5)
  3. python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...
  4. 说说那些死于决斗的大牛
  5. 中国内窥镜光学物镜市场趋势报告、技术动态创新及市场预测
  6. 别再对 Istio 一脸懵了,万众期待的第一本 Istio 著作现!已!上!市
  7. maven依赖c3p0_springboot 使用c3p0数据库连接池的方法
  8. 抢占云安全管理高地 启明星辰先发云SOC
  9. ubuntu中安装hp惠普打印机
  10. 服务器维修工程师个人简历,机械维修工程师个人简历模板精选
  11. cad,max,revit,Civil ,InventorNavisworks 卸载清理工具
  12. xlsxwriter去掉网格线_xlsxwriter图表网格间距
  13. hive presto sql从身份证号提取年龄和性别
  14. 用matlab求二重积分
  15. 5类人最适合做程序员,你属于哪一类?
  16. 衡量度量过程性能的几个指标
  17. 记一次安装 ubuntu 18.04 双系统 (双硬盘)
  18. day79_babasport第五天
  19. 2022第十一届PMO大会日程已定,将于8月13-14日和20-21日线上召开
  20. 男人应该做的50件事(17-33)

热门文章

  1. 博士毕业于浸会大学计算机系,香港浸会大学童铁军博士为计算机与信息学院师生作学术报告...
  2. AI安全---对抗攻击防御措施
  3. linux-lsmod、lspci命令释义
  4. CSDN开会员了,你怎么想?----高级
  5. 自己标注数据集训练基于pytorch3.7的yolov5手掌识别模型
  6. 【java】商城进货交易记录程序设计
  7. mysql (errcode 28)_MySQL出现Errcode:28错误提示解决办法
  8. 每周一个前端动画之四:掘金头像旋转动画
  9. Centos6.5 安装 RabbitMQ3.6.1
  10. 基于嵌入式STT-MRAM的架构方案