BigDecimal使用中的一些注意事项
Java的商业计算,不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。
BigDecimal类位于java.maths类包下。及在商业或银行开发总,涉及到金钱或者倍率的情况下,都用bigdecimal格式。
BigDecimal常用的方法
- public BigDecimal add(BigDecimal augend):加
- public BigDecimal subtract(BigDecimal subtrahend):减
- public BigDecimal multiply(BigDecimal multiplicand):乘
- public BigDecimal divide(BigDecimal divisor):除
- public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):除数,几位小数,如何舍取。
对于BigDecimals您可以同时指定舍入模式和精度,但有一个更方便的方法 - 您可以使用MathContext代替,其中包含精度和舍入的信息。
使用MathContext进行加减运算可以直接操作(会丢失精度),但对于乘除最好规定一个DECIMAL*上下文,它们是必需的,因为当运算结果有一个无限长的十进制扩展,这些操作需要指定精度。否则会报ArithmeticException错误。
下面看看Demo
public class BigDecimalTest { public static void main(String[] args) { BigDecimal b1 = new BigDecimal(13.14); BigDecimal b2 = new BigDecimal(5.20); MathContext mc = new MathContext(4); BigDecimal b3 = b1.add(b2,mc); BigDecimal b4 = b1.subtract(b2); BigDecimal b5 = b1.divide(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. BigDecimal b5 = b1.divide(b2,mc); BigDecimal b6 = b1.multiply(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. BigDecimal b6 = b1.multiply(b2,mc);
System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(b6); } }
另外,在做除法操作时,需要对被除数做非0判断,不然会报java.lang.ArithmeticException: Division by zero。
public class BigDecimalTest { public static void main(String[] args) { BigDecimal b1 = new BigDecimal(13.14); MathContext mc = new MathContext(4); BigDecimal b2 = BigDecimal.ZERO; if (b2.intValue() != 0) { BigDecimal b8 = b1.divide(b2, mc); System.out.println(b8); }else { System.out.println("Division not zero"); } } }
对于double, 请不要将double转为BigDecimal,先将double转为String,再将String转为BigDecimal。
如果你的算术需要将一个字符串作为输入,将其直接转换为BigDecimal。好处是你会避免任何的舍入误差。
作者:JackpotHan
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
分类:
杂谈
标签:
BigDecimal
, 注意事项
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下