Bigdecimal 8種舍入模式演示
因?yàn)槲铱偸菍igdecimal的舍入模式有疑問蝴悉,所以干脆觀察小數(shù)的舍入結(jié)果鳄逾,實(shí)在看不懂那些晦澀難懂的說明侠驯。而且多次理解錯誤導(dǎo)致結(jié)果錯誤兄纺!
程序代碼github地址:
https://github.com/shihua-guo/Java-Learn/tree/master/JavaBigdecimalRound
直接雙擊run就可以運(yùn)行了
測試的數(shù)據(jù)統(tǒng)一精確到小數(shù)點(diǎn)后2位着降,包括幾種類型:
- 正數(shù)咖刃,有2位小數(shù)泳炉,且小于5
- 正數(shù),有2位小數(shù)嚎杨,且大于5
- 正數(shù)花鹅,有3位小數(shù),且第三位小數(shù)小于5
- 正數(shù)枫浙,有3位小數(shù)刨肃,且第三位大數(shù)小于5
- 負(fù)數(shù),有2位小數(shù)箩帚,且小于5
- 負(fù)數(shù)真友,有2位小數(shù),且大于5
- 負(fù)數(shù)紧帕,有3位小數(shù)盔然,且第三位小數(shù)小于5
- 負(fù)數(shù)桅打,有3位小數(shù),且第三位大數(shù)小于5
--------------------ROUND_UP 模式--------------------
原始值[12.12]愈案,舍入后的值[12.12]挺尾,值變化=
原始值[12.16],舍入后的值[12.17]站绪,值變化↑
原始值[12.122]遭铺,舍入后的值[12.13],值變化↑
原始值[12.126]恢准,舍入后的值[12.13]魂挂,值變化↑
原始值[-12.12],舍入后的值[-12.12]顷歌,值變化=
原始值[-12.16]锰蓬,舍入后的值[-12.17],值變化↓
原始值[-12.122]眯漩,舍入后的值[-12.13]芹扭,值變化↓
原始值[-12.126],舍入后的值[-12.13]赦抖,值變化↓
--------------------ROUND_UP 模式--------------------
--------------------ROUND_DOWN 模式--------------------
原始值[12.12]舱卡,舍入后的值[12.11],值變化↓
原始值[12.16]队萤,舍入后的值[12.16]轮锥,值變化=
原始值[12.122],舍入后的值[12.12]要尔,值變化↓
原始值[12.126]舍杜,舍入后的值[12.12],值變化↓
原始值[-12.12]赵辕,舍入后的值[-12.11]既绩,值變化↑
原始值[-12.16],舍入后的值[-12.16]还惠,值變化=
原始值[-12.122]饲握,舍入后的值[-12.12],值變化↑
原始值[-12.126]蚕键,舍入后的值[-12.12]救欧,值變化↑
--------------------ROUND_DOWN 模式--------------------
--------------------ROUND_CEILING 模式--------------------
原始值[12.12],舍入后的值[12.12]锣光,值變化=
原始值[12.16]笆怠,舍入后的值[12.17],值變化↑
原始值[12.122]嫉晶,舍入后的值[12.13]骑疆,值變化↑
原始值[12.126]田篇,舍入后的值[12.13],值變化↑
原始值[-12.12]箍铭,舍入后的值[-12.11]泊柬,值變化↑
原始值[-12.16],舍入后的值[-12.16]诈火,值變化=
原始值[-12.122]兽赁,舍入后的值[-12.12],值變化↑
原始值[-12.126]冷守,舍入后的值[-12.12]刀崖,值變化↑
--------------------ROUND_CEILING 模式--------------------
--------------------ROUND_FLOOR 模式--------------------
原始值[12.12],舍入后的值[12.11]拍摇,值變化↓
原始值[12.16]亮钦,舍入后的值[12.16],值變化=
原始值[12.122]充活,舍入后的值[12.12]蜂莉,值變化↓
原始值[12.126],舍入后的值[12.12]混卵,值變化↓
原始值[-12.12]映穗,舍入后的值[-12.12],值變化=
原始值[-12.16]幕随,舍入后的值[-12.17]蚁滋,值變化↓
原始值[-12.122],舍入后的值[-12.13]赘淮,值變化↓
原始值[-12.126]辕录,舍入后的值[-12.13],值變化↓
--------------------ROUND_FLOOR 模式--------------------
--------------------ROUND_HALF_UP 模式--------------------
原始值[12.12]梢卸,舍入后的值[12.12]踏拜,值變化=
原始值[12.16],舍入后的值[12.16]低剔,值變化=
原始值[12.122],舍入后的值[12.12]肮塞,值變化↓
原始值[12.126]襟齿,舍入后的值[12.13],值變化↑
原始值[-12.12]枕赵,舍入后的值[-12.12]猜欺,值變化=
原始值[-12.16],舍入后的值[-12.16]拷窜,值變化=
原始值[-12.122]开皿,舍入后的值[-12.12]涧黄,值變化↑
原始值[-12.126],舍入后的值[-12.13]赋荆,值變化↓
--------------------ROUND_HALF_UP 模式--------------------
--------------------ROUND_HALF_DOWN 模式--------------------
原始值[12.12]笋妥,舍入后的值[12.12],值變化=
原始值[12.16]窄潭,舍入后的值[12.16]春宣,值變化=
原始值[12.122],舍入后的值[12.12]嫉你,值變化↓
原始值[12.126]月帝,舍入后的值[12.13],值變化↑
原始值[-12.12]幽污,舍入后的值[-12.12]嚷辅,值變化=
原始值[-12.16],舍入后的值[-12.16]距误,值變化=
原始值[-12.122]簸搞,舍入后的值[-12.12],值變化↑
原始值[-12.126]深寥,舍入后的值[-12.13]攘乒,值變化↓
--------------------ROUND_HALF_DOWN 模式--------------------
--------------------ROUND_HALF_EVEN 模式--------------------
原始值[12.12],舍入后的值[12.12]惋鹅,值變化=
原始值[12.16]则酝,舍入后的值[12.16],值變化=
原始值[12.122]闰集,舍入后的值[12.12]沽讹,值變化↓
原始值[12.126],舍入后的值[12.13]武鲁,值變化↑
原始值[-12.12]爽雄,舍入后的值[-12.12],值變化=
原始值[-12.16]沐鼠,舍入后的值[-12.16]挚瘟,值變化=
原始值[-12.122],舍入后的值[-12.12]饲梭,值變化↑
原始值[-12.126]乘盖,舍入后的值[-12.13],值變化↓
--------------------ROUND_HALF_EVEN 模式--------------------
8種舍入模式說明
-
ROUND_UP
舍入遠(yuǎn)離零的舍入模式憔涉。
在丟棄非零部分之前始終增加數(shù)字(始終對非零舍棄部分前面的數(shù)字加1)订框。
注意,此舍入模式始終不會減少計算值的大小兜叨。
1.105 = 1.11 -
ROUND_DOWN
接近零的舍入模式穿扳。
在丟棄某部分之前始終不增加數(shù)字(從不對舍棄部分前面的數(shù)字加1衩侥,即截短)。
注意矛物,此舍入模式始終不會增加計算值的大小茫死。
1.105 = 1.10 -
ROUND_CEILING
接近正無窮大的舍入模式。
如果 BigDecimal 為正泽谨,則舍入行為與 ROUND_UP 相同;
如果為負(fù)璧榄,則舍入行為與 ROUND_DOWN 相同。
注意吧雹,此舍入模式始終不會減少計算值骨杂。 -
ROUND_FLOOR
接近負(fù)無窮大的舍入模式。
如果 BigDecimal 為正雄卷,則舍入行為與 ROUND_DOWN 相同;
如果為負(fù)搓蚪,則舍入行為與 ROUND_UP 相同。
注意丁鹉,此舍入模式始終不會增加計算值妒潭。 -
ROUND_HALF_UP
向“最接近的”數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等揣钦,則為向上舍入的舍入模式雳灾。
如果舍棄部分 >= 0.5,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同冯凹。
注意谎亩,這是我們大多數(shù)人在小學(xué)時就學(xué)過的舍入模式(四舍五入)。 -
ROUND_HALF_DOWN
向“最接近的”數(shù)字舍入宇姚,如果與兩個相鄰數(shù)字的距離相等匈庭,則為上舍入的舍入模式。
如果舍棄部分 > 0.5浑劳,則舍入行為與 ROUND_UP 相同;否則舍入行為與 ROUND_DOWN 相同(五舍六入)阱持。 -
ROUND_HALF_EVEN
向“最接近的”數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等魔熏,則向相鄰的偶數(shù)舍入衷咽。
如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;
如果為偶數(shù)蒜绽,則舍入行為與 ROUND_HALF_DOWN 相同兵罢。
注意,在重復(fù)進(jìn)行一系列計算時滓窍,此舍入模式可以將累加錯誤減到最小。
此舍入模式也稱為“銀行家舍入法”巩那,主要在美國使用吏夯。
四舍六入此蜈,五分兩種情況。
如果前一位為奇數(shù)噪生,則入位裆赵,否則舍去。
以下例子為保留小數(shù)點(diǎn)1位跺嗽,那么這種舍入方式下的結(jié)果战授。
1.15 = 1.2, 1.25 = 1.2 -
ROUND_UNNECESSARY
斷言請求的操作具有精確的結(jié)果桨嫁,因此不需要舍入植兰。
如果對獲得精確結(jié)果的操作指定此舍入模式,則拋出ArithmeticException