參考文獻(xiàn):《Java瘋狂講義》(第三版)
BigDecimal類
問題:double類型會(huì)發(fā)生精度丟失(不止是Java)们童,尤其是進(jìn)行算術(shù)運(yùn)算的時(shí)候拧揽。
為此嫌套,Java提供了BigDecimal類座每;
解決方法:提供大量構(gòu)造器用于創(chuàng)建BigDecimal對象狮惜,包括所有基本數(shù)值型變量轉(zhuǎn)換成一個(gè)BigDecimal對象高诺,也包括利用數(shù)字字符串碌识,數(shù)字字符串?dāng)?shù)組來創(chuàng)建BigDecimal對象
注:不推薦使用構(gòu)造器,因?yàn)槭褂脴?gòu)造器時(shí)有一定不可預(yù)知性虱而。
例:當(dāng)程序使用new BigDecimal(0.1)來創(chuàng)建一個(gè)BigDecimal對象時(shí)筏餐,它的值不是0.1,它實(shí)際上是等于一個(gè)近似0.1的數(shù)牡拇。這是因?yàn)?.1無法準(zhǔn)確地表示為double浮點(diǎn)數(shù)魁瞪,所以傳入BigDecimal的值不會(huì)正好等于0.1。
技巧:
如果使用BigDecimal(String val)構(gòu)造器的結(jié)果是可預(yù)知的——寫入new BigDecimal(“0.1”)將創(chuàng)建一個(gè)BigDecimal惠呼,它正好等于預(yù)期的0.1导俘。因此通常建議優(yōu)先使用基于String的構(gòu)造器。
使用方式:
如果必須使用double浮點(diǎn)數(shù)作為BigDecimal構(gòu)造器的參數(shù)時(shí)罢杉,不要直接將該double浮點(diǎn)數(shù)作為構(gòu)造器參數(shù)創(chuàng)建BigDecimal對象趟畏,而是應(yīng)該通過BigDecimal.valueOf(double value)靜態(tài)方法來創(chuàng)建BigDecimal對象。
BigDecimal類提供了方法對精確浮點(diǎn)數(shù)進(jìn)行常規(guī)算術(shù)運(yùn)算滩租。
注:創(chuàng)建BigDecimal對象時(shí)赋秀,不要直接使用浮點(diǎn)數(shù)double作為構(gòu)造器參數(shù)來調(diào)用BigDecimal構(gòu)造器,否則同樣會(huì)發(fā)生精度丟失律想。