bigdicmal除法精度设置_关于BigDecimal.divide()的精度问
⽹上随便⼀搜,是这么写的:
ROUND_CEILING
Rounding mode to round towards positive infinity.
向正⽆穷⽅向舍⼊
ROUND_DOWN
Rounding mode to round towards zero.
向零⽅向舍⼊
ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负⽆穷⽅向舍⼊
ROUND_HALF_DOWN
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,向下舍⼊, 例如1.55 保留⼀位⼩数结果为1.5
ROUND_HALF_EVEN
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,如果保留位数是奇数,使⽤ROUND_HALF_UP ,如果是偶数,使⽤ROUND_HALF_DOWN
ROUND_HALF_UP
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.
向(距离)最近的⼀边舍⼊,除⾮两边(的距离)是相等,如果是这样,向上舍⼊, 1.55保留⼀位⼩数结果为1.6
ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍⼊模式
ROUND_UP
Rounding mode to round away from zero.
向远离0的⽅向舍⼊
MathContext mathContext = new MathContext(2,RoundingMode.UP);
BigDecimal test1 = BigDecimal.valueOf(19785.076);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,mathContext).doubleValue());
结果是多少?
200.0
奇怪了,为什么是200.0?其实我的⽬的是想结果为:197.86。因为我是这么想的:保留2位⼩数,然后⼩数的2位之后如果还有数(也就是说后⾯的⼤于0),那么会进1位。
但结果就是200.0,后来查了⼀下那MathContext⾥⾯的2并不是指保留2位⼩数,⽽是指的有效位数。所以
BigDecimal.divide(BigDecimical,MathContext)就不能⽤了。直接⽤
BigDecimal.divide(BigDecimaldivisor,RoundingModeroundingMode).setScale(intnewScale,RoundingModeroundingMode)来解决问题。
但是,直接⽤BigDecimal.divide(BigDecimaldivisor,RoundingModeroundingMode)那么它是保留⼏位呢?懒得看源码,简单测试了⼀下,结果是:
eg1:
BigDecimal test1 = BigDecimal.valueOf(19785.076);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.851
eg2:
BigDecimal test1 = BigDecimal.valueOf(19785.070);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.86
eg3:
BigDecimal test1 = BigDecimal.valueOf(19785.006);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.851
eg4:
BigDecimal test1 = BigDecimal.valueOf(19785.06);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.86
eg5:
BigDecimal test1 = BigDecimal.valueOf(19785.1);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.9
eg6:
BigDecimal test1 = BigDecimal.valueOf(19785);
BigDecimal test2 = BigDecimal.valueOf(100.0d);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:198.0
eg7:
BigDecimal test1 = BigDecimal.valueOf(19785);
BigDecimal test2 = BigDecimal.valueOf(100);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:198.0
bigdecimal除法保留小数
eg8:
BigDecimal test1 = BigDecimal.valueOf(19785);
BigDecimal test2 = BigDecimal.valueOf(100.01);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:198.0
eg9:
BigDecimal test1 = BigDecimal.valueOf(19785);
BigDecimal test2 = BigDecimal.valueOf(100.11);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:198.0
eg10:
BigDecimal test1 = BigDecimal.valueOf(19785);
BigDecimal test2 = BigDecimal.valueOf(100.91);
LogUtil.i("result="+test1.divide(test2,RoundingMode.UP).doubleValue());//输出:197.0
发现规律了吗?
RoundingMode:
1、除数的⼩数点位数与结果的位数直接相关联,⽽被除数的⼩数点位数与结果的位数没有啥关系(⾄少简单测试⼀下看上去是这样),但是被除数的⼩数位数不是说没有⽤,⽽是对结果与直接关联。
2、除数如果是N位⼩数,那么结果就会是N位⼩数。但有2个例外:
①除数如果没有⼩数,在BigDecimal后⾯再继续⽤doubleValue会发现有xxx.0出现;
②除数的最后1位如果为0,那么就会被忽略。如上eg2与eg3。
先不写了。反正就没打算给别⼈看的,⾃⼰记录⼀下就OK了,所以也没啥排版,知识也不够全⾯。