BigDecimal进行除法运算时的坑
循环小数输出的坑
BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常:
BigDecimal a = new BigDecimal("1"); System.out.println(a.divide(new BigDecimal(3)));
异常如下:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
解决办法:使用如下两个函数设置精度
- divide(num, scale)
- divide(num, scale, roundingMode)
- 其中,scale 是保留的位数
System.out.println(a.divide(new BigDecimal(30), 2,BigDecimal.ROUND_HALF_UP));
构造函数的坑
先看下面这段代码:
public static void main(String[] args) { BigDecimal value1 =new BigDecimal(1024.511); System.out.println("value1: " + value1); BigDecimal value2 = new BigDecimal("1024.511"); System.out.println("value2: " + value2); }
按照我们的预想,value1输出的应该是10.511,可是实际的值却不是这样,如下:
value1: 10.510999999999999232613845379091799259185791015625
value2: 10.511
当我们用double类型的数据作为参数时,构造出的 BigDecimal 对象 value1 并不能保证数据的准确性。而用 String 作为参数构造对象时,数据丝毫不差。
Reference
读后有收获,小礼物走一走,请作者喝咖啡。

作者:楼兰胡杨
本文版权归作者和博客园共有,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南