BigDecimal使用
java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
初始化BigDecimal对象
BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如:
1 | BigDecimal g = new BigDecimal( 0 .1F); //实际的存储值为:0.100000001490116119384765625 |
优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
1 2 | BigDecimal recommend1 = new BigDecimal( "0.1" ); BigDecimal recommend2 = BigDecimal.valueOf( 0.1 ); |
加减乘除
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)
BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
1 | a.divide(b, 2 , BigDecimal.ROUND_HALF_DOWN) |
取反
negate()
比较
compareTo(BigDecimal)
示例:a.compareTo(b)
a>b 返回1
a=b 返回0
a<b 返回-1
设置小数点精确度
// 1. ROUND_DOWN(直接省略掉指定位数后的内容) BigDecimal bigDecimal = new BigDecimal("2.123456").setScale(2, BigDecimal.ROUND_DOWN); System.out.println("ROUND_DOWN:" + bigDecimal);//2.12 // 2. ROUND_UP(直接对指定位数后的内容做进一位处理) BigDecimal bigDecimal2 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_UP); System.out.println("ROUND_UP:" + bigDecimal2);//2.13 // 3. ROUND_CEILING(正数使用ROUND_UP 规则,负数使用ROUND_DOWN 规则) BigDecimal bigDecimal3 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_CEILING); System.out.println("ROUND_CEILING:" + bigDecimal3);//2.13 BigDecimal bigDecimal4 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_CEILING); System.out.println("ROUND_CEILING:" + bigDecimal4);//-2.12 // 4. ROUND_FLOOR(正数省略内容,负数向下进一位) BigDecimal bigDecimal5 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_FLOOR); System.out.println("ROUND_FLOOR:" + bigDecimal5);//2.12 BigDecimal bigDecimal6 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_FLOOR); System.out.println("ROUND_FLOOR:" + bigDecimal6);//-2.13 // 5. ROUND_HALF_UP,ROUND_HALF_DOWN(四舍五入) BigDecimal bigDecimal7 = new BigDecimal("2.125456").setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println("ROUND_HALF_UP:" + bigDecimal7);//2.13 BigDecimal bigDecimal8 = new BigDecimal("-2.125456").setScale(2, BigDecimal.ROUND_HALF_DOWN); System.out.println("ROUND_HALF_DOWN:" + bigDecimal8);//-2.13 // 6. ROUND_HALF_EVEN(指定小数位的前一位如果是奇数则四舍五入后进位,如果是偶数则舍弃指定小数位后面内容) BigDecimal bigDecimal9 = new BigDecimal("2.113").setScale(2, BigDecimal.ROUND_HALF_EVEN); System.out.println("ROUND_HALF_EVEN:" + bigDecimal9);//2.11 虽然是奇数,但是3<5,不会进位 BigDecimal bigDecimal10 = new BigDecimal("2.115").setScale(2, BigDecimal.ROUND_HALF_EVEN); System.out.println("ROUND_HALF_EVEN:" + bigDecimal10);//2.12 因为是奇数且符合"五入",则进位 // 此舍入模式也称为“银行家舍入法”。四舍六入,五分两种情况。 // 如果前一位为奇数,则入位,否则舍去。 // 8.ROUND_UNNECESSARY(断言请求的操作具有精确的结果,因此不需要舍入。) // 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException
去除尾部多余的0:
1 | .stripTrailingZeros() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律