java.math.BigDecimal
不可變的、任意精度的有符號(hào)十進(jìn)制數(shù)娶耍。BigDecimal 由任意精度的整數(shù)非標(biāo)度值和32位的整數(shù)標(biāo)度(scale)組成。
如果為零或正數(shù),則標(biāo)度是小數(shù)點(diǎn)后的位數(shù)伪朽。如果為負(fù)數(shù),則將該數(shù)的非標(biāo)度值乘以10的負(fù)scale次冪汛蝙。
因此烈涮,BigDecimal表示的數(shù)值是(unscaledValue × 10-scale)。
與之相關(guān)的還有兩個(gè)類:
java.math.MathContext:
該對(duì)象是封裝上下文設(shè)置的不可變對(duì)象窖剑,它描述數(shù)字運(yùn)算符的某些規(guī)則坚洽,如數(shù)據(jù)的精度,舍入方式等西土。
java.math.RoundingMode:
這是一種枚舉類型讶舰,定義了很多常用的數(shù)據(jù)舍入方式。
這個(gè)類用起來還是很比較復(fù)雜的需了,原因在于舍入模式跳昼,數(shù)據(jù)運(yùn)算規(guī)則太多太多,
不是數(shù)學(xué)專業(yè)出身的人看著中文API都難以理解肋乍,這些規(guī)則在實(shí)際中使用的時(shí)候在翻閱都來得及庐舟。
在銀行、帳戶住拭、計(jì)費(fèi)等領(lǐng)域挪略,BigDecimal提供了精確的數(shù)值計(jì)算历帚。其中8種舍入方式值得掌握。
1杠娱、ROUND_UP
舍入遠(yuǎn)離零的舍入模式挽牢。
在丟棄非零部分之前始終增加數(shù)字(始終對(duì)非零舍棄部分前面的數(shù)字加1)。
注意摊求,此舍入模式始終不會(huì)減少計(jì)算值的大小禽拔。
2、ROUND_DOWN
接近零的舍入模式室叉。
在丟棄某部分之前始終不增加數(shù)字(從不對(duì)舍棄部分前面的數(shù)字加1睹栖,即截短)。
注意茧痕,此舍入模式始終不會(huì)增加計(jì)算值的大小野来。
3、ROUND_CEILING
接近正無窮大的舍入模式踪旷。
如果 BigDecimal 為正曼氛,則舍入行為與 ROUND_UP 相同;
如果為負(fù),則舍入行為與 ROUND_DOWN 相同令野。
注意舀患,此舍入模式始終不會(huì)減少計(jì)算值。
4气破、ROUND_FLOOR
接近負(fù)無窮大的舍入模式聊浅。
如果 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;
如果為負(fù)现使,則舍入行為與 ROUND_UP 相同狗超。
注意,此舍入模式始終不會(huì)增加計(jì)算值朴下。
5努咐、ROUND_HALF_UP
向“最接近的”數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等,則為向上舍入的舍入模式。
如果舍棄部分 >= 0.5学搜,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同境析。
注意,這是我們大多數(shù)人在小學(xué)時(shí)就學(xué)過的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
向“最接近的”數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等拱燃,則為上舍入的舍入模式。
如果舍棄部分 > 0.5力惯,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同(五舍六入)碗誉。
7召嘶、ROUND_HALF_EVEN
向“最接近的”數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等哮缺,則向相鄰的偶數(shù)舍入弄跌。
如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;
如果為偶數(shù)尝苇,則舍入行為與 ROUND_HALF_DOWN 相同铛只。
注意,在重復(fù)進(jìn)行一系列計(jì)算時(shí)糠溜,此舍入模式可以將累加錯(cuò)誤減到最小淳玩。
此舍入模式也稱為“銀行家舍入法”,主要在美國(guó)使用非竿。四舍六入蜕着,五分兩種情況。
如果前一位為奇數(shù)汽馋,則入位,否則舍去圈盔。
以下例子為保留小數(shù)點(diǎn)1位豹芯,那么這種舍入方式下的結(jié)果。
1.15>1.2 1.25>1.2
8驱敲、ROUND_UNNECESSARY
斷言請(qǐng)求的操作具有精確的結(jié)果铁蹈,因此不需要舍入。
如果對(duì)獲得精確結(jié)果的操作指定此舍入模式众眨,則拋出ArithmeticException握牧。