BigDecimal史上最全详解
本篇主要介绍BigDecimal类型基本操作+保留精度+取整+取余+比较大小+类型转换
基本操作加,减,乘,除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class BigDecimalTest { public static void main(String[] args) { BigDecimal bignum1 = new BigDecimal( "7.25" ); BigDecimal bignum2 = new BigDecimal( "5.00" ); BigDecimal bignum3 = null ; //加法 bignum3 = bignum1.add(bignum2); System.out.println( "和 是:" + bignum3); //减法 bignum3 = bignum1.subtract(bignum2); System.out.println( "差 是:" + bignum3); //乘法 bignum3 = bignum1.multiply(bignum2); System.out.println( "积 是:" + bignum3); //除法 bignum3 = bignum1.divide(bignum2); System.out.println( "商 是:" + bignum3); } } |
运行结果:
和 是:12.25
差 是:2.25
积 是:36.2500
商 是:1.45
保留精度及取整(保留0位小数)
scale为小数位数;roundingMode为小数模式;
除法保留50位小数:bignum1.divide(bignum2,50,BigDecimal.ROUND_UP);
乘法保留一位小数: bignum1.multiply(bignum2).setScale(1,BigDecimal.ROUND_HALF_UP);
乘法运行结果:积 是:36.3
问题来了,我们不设置精度时是36.2500 保留一位小数时是36.3,这是为什么呢?原来和.ROUND_HALF_UP有关!
以不保留小数为例取整,各个roundingMode详解如下:
ROUND_UP:正数时,舍弃小数后(整数部分)加1,比如12.49结果为13。负数时,舍弃小数后(整数部分)减去1,-12.49结果为 -13
ROUND_DOWN:直接舍弃小数
ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (取附近较大的整数)
ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(取附近较小的整数)
ROUND_HALF_UP:四舍五入(取更近的整数)
ROUND_HALF_DOWN:同ROUND_HALF_UP 差别仅在于0.5时会向下取整
ROUND_HALF_EVEN:取最近的偶数
ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常
看到这里我们可以推理在保留小数取整的时候,保留一位小数时36.25因为四舍五入到36.3,如果用ROUND_HALF_DOWN那结果就是36.2,如果用ROUND_UP那结果就是36.3,如果用ROUND_DOWN那结果就是36.2
取余(divideAndRemainder方法)
1 | public BigDecimal[] divideAndRemainder(BigDecimal divisor); |
该方法接收另一个BigDecimal 对象作为参数,该参数即为除数,返回一个BigDecimal数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数。使用案例如下:
1 2 3 4 5 6 7 8 9 10 11 12 | package net.csdn.test; import java.math.BigDecimal; public class TestBigDecimal { public static void main(String[] args) { BigDecimal amt = new BigDecimal( 14 ); BigDecimal[] results = amt.divideAndRemainder(BigDecimal.valueOf( 5.00 )); System.out.println(results[ 0 ]); System.out.println(results[ 1 ]); } } |
运行程序分别输出商2,余数4.0,可以达到和基本数据类型%运算相同的效果。
比较大小(compareTo)
int a =baltotal.compareTo(hundred); 若a>0或a=1则baltotal大,a=0则baltotal等于参数,a<0或a=-1则baltotal小
应用场景:电单车充电以电池电量百分之五为阶梯收费,百分之五收0.2元,百分之六收0.4元,这时需要判断取余后的余数
是否大于0,int a =baltotal.compareTo(BigDecimal.ZERO);
int与bigdecimal的相互转换
int转bigdecimal
1 2 3 | BigDecimal number = new BigDecimal( 0 ); int value= 1 ; number=BigDecimal.valueOf((value); |
bigdecimal转int
1 2 | BigDecimal b= new BigDecimal( 45.45 ); int a = b.intValue(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了