当前位置: 首页 > article >正文

报错Non-terminating decimal expansion; no exact representable decimal result

异常代码:

BigDecimal.valueOf(100).divide(BigDecimal.valueOf(5))
            .setScale(2, RoundingMode.HALF_UP)

出现该错误的原因是:在调用 BigDecimal.divide() 方法时,除法运算的结果是一个无限不循环小数(例如 1/3 = 0.333...),而代码中未在除法运算阶段指定舍入模式(Rounding Mode),导致无法精确表示结果。

错误分析:

divide() 方法调用时未指定舍入模式。当除法无法得到精确结果时(例如 10/3 = 3.333...),BigDecimal 会抛出 ArithmeticException,提示 "Non-terminating decimal expansion"。

修复方法:

在除法运算时直接指定舍入模式和精度,而不是在除法之后才设置精度。修改后的代码如下:

BigDecimal.valueOf(100)
             .divide(BigDecimal.valueOf(5), 2, RoundingMode.HALF_UP) 
             .doubleValue()

改进点:

  1. 正确使用除法:通过 divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 方法,在除法阶段指定结果的小数位数和舍入模式,确保运算合法。
  2. 简化代码:合并 setScale(2, RoundingMode.HALF_UP) 到 divide() 方法中,减少冗余操作。

总结:

BigDecimal 的除法操作必须处理无限小数的情况。通过在 divide() 中直接指定精度和舍入模式,可以避免异常并确保计算结果的正确性。


http://www.kler.cn/a/572716.html

相关文章:

  • 【YOLO V5】目标检测 WSL2 AutoDL VScode SSH
  • MySQL环境搭建
  • 充分必要条件
  • Spring Boot 3 整合 MinIO 实现分布式文件存储
  • 大模型基石——Transformer介绍
  • 蓝桥杯4T平台(频率测量显示)
  • FPGA有关HDMI的一些知识,程序源自bilibi正点原子
  • Ubuntu20.04双系统安装及软件安装(一):系统安装
  • 数字电子技术基础(二十四)——TTL门电路的高、低电平的输出特性曲线
  • 大模型简介
  • 【Linux】磁盘结构 | 文件系统 | inode(二)
  • FastGPT 源码:controller.ts 主要定义
  • Ollama存在安全风险的情况通报及解决方案
  • vue组合式API中prop
  • 亚远景-ASPICE培训:助力汽车软件开发团队成长
  • 网络安全的八大机制
  • 在 Windows 上最快速安装 Qt 5
  • 六足仿生机器人地形自适应步态规划研究
  • 解决使用 HBuilder X 软件、uni-app 框架和 uView UI 框架开发的项目,需要同时发布成 H5 和微信小程序,且部分页面存在差异问题
  • Expo:快速验证跨平台应用的工程化方案