【100期】面試官:BigDecimal一定不會丟失精度嗎?
閱讀本文大概需要 5 分鐘。
來自:www.jianshu.com/p/c81edc59546c
System.out.println(0.05?+?0.01);??
System.out.println(1.0?-?0.42);??
System.out.println(4.015?*?100);??
System.out.println(123.3?/?100);??
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
API
構(gòu)造器 描述
BigDecimal(int) 創(chuàng)建一個具有參數(shù)所指定整數(shù)值的對象。
BigDecimal(double) 創(chuàng)建一個具有參數(shù)所指定雙精度值的對象。
BigDecimal(long) 創(chuàng)建一個具有參數(shù)所指定長整數(shù)值的對象。
BigDecimal(String) 創(chuàng)建一個具有參數(shù)所指定以字符串表示的數(shù)值的對象。
方法 描述
add(BigDecimal) BigDecimal對象中的值相加,然后返回這個對象。
subtract(BigDecimal) BigDecimal對象中的值相減,然后返回這個對象。
multiply(BigDecimal) BigDecimal對象中的值相乘,然后返回這個對象。
divide(BigDecimal) BigDecimal對象中的值相除,然后返回這個對象。
toString() 將BigDecimal對象的數(shù)值轉(zhuǎn)換成字符串。
doubleValue() 將BigDecimal對象中的值以雙精度數(shù)返回。
floatValue() 將BigDecimal對象中的值以單精度數(shù)返回。
longValue() 將BigDecimal對象中的值以長整數(shù)返回。
intValue() 將BigDecimal對象中的值以整數(shù)返回。
BigDecimal精度也丟失
BigDecimal a = new BigDecimal(1.01);
BigDecimal b = new BigDecimal(1.02);
BigDecimal c = new BigDecimal("1.01");
BigDecimal d = new BigDecimal("1.02");
System.out.println(a.add(b));
System.out.println(c.add(d));
2.0300000000000000266453525910037569701671600341796875
2.03
*?The?results?of?this?constructor?can?be?somewhat?unpredictable.??
?????*?One?might?assume?that?writing?{@codenew?BigDecimal(0.1)}?in??
?????*?Java?creates?a?{@code?BigDecimal}?which?is?exactly?equal?to??
?????*?0.1?(an?unscaled?value?of?1,?with?a?scale?of?1),?but?it?is??
?????*?actually?equal?to??
?????*?0.1000000000000000055511151231257827021181583404541015625.??
?????*?This?is?because?0.1?cannot?be?represented?exactly?as?a??
?????*?{@codedouble}?(or,?for?that?matter,?as?a?binary?fraction?of??
?????*?any?finite?length).??Thus,?the?value?that?is?being?passed??
?????*?in?to?the?constructor?is?not?exactly?equal?to?0.1,??
?????*?appearances?notwithstanding.??
???????……??
????????*?When?a?{@codedouble}?must?be?used?as?a?source?for?a??
?????*?{@code?BigDecimal},?note?that?this?constructor?provides?an??
?????*?exact?conversion;?it?does?not?give?the?same?result?as??
?????*?converting?the?{@codedouble}?to?a?{@code?String}?using?the??
?????*?{@link?Double#toString(double)}?method?and?then?using?the??
?????*?{@link?#BigDecimal(String)}?constructor.??To?get?that?result,??
?????*?use?the?{@codestatic}?{@link?#valueOf(double)}?method.??
?????*???
public?BigDecimal(double?val)?{??
????this(val,MathContext.UNLIMITED);??
}??
正確運(yùn)用BigDecimal
/**??
?*?@author:?Ji?YongGuang.??
?*?@date:?19:50?2017/12/14.??
?*/??
publicclass?BigDecimalUtil?{??
????private?BigDecimalUtil()?{??
????}??
????public?static?BigDecimal?add(double?v1,?double?v2)?{//?v1?+?v2??
????????BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));??
????????BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));??
????????return?b1.add(b2);??
????}??
????public?static?BigDecimal?sub(double?v1,?double?v2)?{??
????????BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));??
????????BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));??
????????return?b1.subtract(b2);??
????}??
????public?static?BigDecimal?mul(double?v1,?double?v2)?{??
????????BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));??
????????BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));??
????????return?b1.multiply(b2);??
????}??
????public?static?BigDecimal?div(double?v1,?double?v2)?{??
????????BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));??
????????BigDecimal?b2?=?new?BigDecimal(Double.toString(v2));??
????????//?2?=?保留小數(shù)點(diǎn)后兩位???ROUND_HALF_UP?=?四舍五入??
????????return?b1.divide(b2,?2,?BigDecimal.ROUND_HALF_UP);//?應(yīng)對除不盡的情況??
????}??
}??
推薦閱讀:
【99期】中高級開發(fā)面試必問的Redis,看這篇就夠了!
【98期】面試官:給我說說你對Java GC機(jī)制的理解?
【97期】一網(wǎng)打盡面試中常被問及的8種數(shù)據(jù)結(jié)構(gòu)
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

