BigDecimalの動きも確認してみた。
BigDecimal[] v = { new BigDecimal("-3.6"), new BigDecimal("-3.5"), new BigDecimal("-2.5"), new BigDecimal("-1.5"), new BigDecimal("1.5"), new BigDecimal("2.5"), new BigDecimal("3.5"), new BigDecimal("3.6") }; for ( int i = 0 ; i < v.length ; i++ ) { System.out.println("[ROUND_HALF_UP] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_HALF_UP)); System.out.println("[ROUND_HALF_EVEN] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_HALF_EVEN)); System.out.println("[ROUND_HALF_DOWN] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_HALF_DOWN)); System.out.println("[ROUND_CEILING] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_CEILING)); System.out.println("[ROUND_FLOOR] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_FLOOR)); System.out.println("[ROUND_UP] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_UP)); System.out.println("[ROUND_DOWN] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_DOWN)); //System.out.println("[ROUND_UNNECESSARY] " + v[i] + " - > " + v[i].setScale(0, BigDecimal.ROUND_UNNECESSARY)); }
の結果
[ROUND_HALF_UP] -3.6 - > -4 [ROUND_HALF_EVEN] -3.6 - > -4 [ROUND_HALF_DOWN] -3.6 - > -4 [ROUND_CEILING] -3.6 - > -3 [ROUND_FLOOR] -3.6 - > -4 [ROUND_UP] -3.6 - > -4 [ROUND_DOWN] -3.6 - > -3 [ROUND_HALF_UP] -3.5 - > -4 [ROUND_HALF_EVEN] -3.5 - > -4 [ROUND_HALF_DOWN] -3.5 - > -3 [ROUND_CEILING] -3.5 - > -3 [ROUND_FLOOR] -3.5 - > -4 [ROUND_UP] -3.5 - > -4 [ROUND_DOWN] -3.5 - > -3 [ROUND_HALF_UP] -2.5 - > -3 [ROUND_HALF_EVEN] -2.5 - > -2 [ROUND_HALF_DOWN] -2.5 - > -2 [ROUND_CEILING] -2.5 - > -2 [ROUND_FLOOR] -2.5 - > -3 [ROUND_UP] -2.5 - > -3 [ROUND_DOWN] -2.5 - > -2 [ROUND_HALF_UP] -1.5 - > -2 [ROUND_HALF_EVEN] -1.5 - > -2 [ROUND_HALF_DOWN] -1.5 - > -1 [ROUND_CEILING] -1.5 - > -1 [ROUND_FLOOR] -1.5 - > -2 [ROUND_UP] -1.5 - > -2 [ROUND_DOWN] -1.5 - > -1 [ROUND_HALF_UP] 1.5 - > 2 [ROUND_HALF_EVEN] 1.5 - > 2 [ROUND_HALF_DOWN] 1.5 - > 1 [ROUND_CEILING] 1.5 - > 2 [ROUND_FLOOR] 1.5 - > 1 [ROUND_UP] 1.5 - > 2 [ROUND_DOWN] 1.5 - > 1 [ROUND_HALF_UP] 2.5 - > 3 [ROUND_HALF_EVEN] 2.5 - > 2 [ROUND_HALF_DOWN] 2.5 - > 2 [ROUND_CEILING] 2.5 - > 3 [ROUND_FLOOR] 2.5 - > 2 [ROUND_UP] 2.5 - > 3 [ROUND_DOWN] 2.5 - > 2 [ROUND_HALF_UP] 3.5 - > 4 [ROUND_HALF_EVEN] 3.5 - > 4 [ROUND_HALF_DOWN] 3.5 - > 3 [ROUND_CEILING] 3.5 - > 4 [ROUND_FLOOR] 3.5 - > 3 [ROUND_UP] 3.5 - > 4 [ROUND_DOWN] 3.5 - > 3 [ROUND_HALF_UP] 3.6 - > 4 [ROUND_HALF_EVEN] 3.6 - > 4 [ROUND_HALF_DOWN] 3.6 - > 4 [ROUND_CEILING] 3.6 - > 4 [ROUND_FLOOR] 3.6 - > 3 [ROUND_UP] 3.6 - > 4 [ROUND_DOWN] 3.6 - > 3
ROUND_CEILINGとROUND_FLOORは、数直線上で一方向への丸め。
ROUND_UPとROUND_DOWNは、絶対値での丸め。
ROUND_HALF_UPは、絶対値での四捨五入。
ROUND_HALF_EVENは、(絶対値での)偶数丸め。
ROUND_HALF_DOWNは、絶対値での五捨六入。
で、ここの選択肢に相当する丸めはこんな感じ。
A1:切り捨て(ROUND_FLOOR)/切り上げ(ROUND_CEILING)/四捨五入(該当なし)
A2:切り捨て(ROUND_DOWN)/切り上げ(ROUND_UP)/四捨五入(ROUND_HALF_UP)
A3:切り捨て(ROUND_FLOOR)/切り上げ(ROUND_CEILING)/四捨五入(ROUND_HALF_EVEN)
ちなみに、むかーしむかーしw四捨五入の関数が普通にない頃www自作してたのをJavaで書くとこんな感じ?
double[] val = { -5.5d, -5.0d, -4.5d, -4.0d, -3.8d, -3.5d, -3.3d, -3.0d, -2.5d, -2.0d, -1.5d, -1.0d, -0.5d , 0.0d, 0.5d, 1.0d, 1.5d, 2.0d, 2.5d, 3.0d, 3.3d, 3.5d, 3.8d, 4.0d, 4.5d, 5.0d, 5.5d }; for ( int i = 0 ; i < val.length ; i++ ) { double tmp = val[i]; if (tmp != new Integer(new Double(tmp).intValue()).doubleValue()) { tmp = new Integer(new Double(val[i] + ((val[i] < 0) ? -0.5d : 0.5d)).intValue()).doubleValue(); } System.out.println("[自作]" + val[i] + " - > " + tmp); }
と結果
[自作]-5.5 - > -6.0 [自作]-5.0 - > -5.0 [自作]-4.5 - > -5.0 [自作]-4.0 - > -4.0 [自作]-3.8 - > -4.0 [自作]-3.5 - > -4.0 [自作]-3.3 - > -3.0 [自作]-3.0 - > -3.0 [自作]-2.5 - > -3.0 [自作]-2.0 - > -2.0 [自作]-1.5 - > -2.0 [自作]-1.0 - > -1.0 [自作]-0.5 - > -1.0 [自作]0.0 - > 0.0 [自作]0.5 - > 1.0 [自作]1.0 - > 1.0 [自作]1.5 - > 2.0 [自作]2.0 - > 2.0 [自作]2.5 - > 3.0 [自作]3.0 - > 3.0 [自作]3.3 - > 3.0 [自作]3.5 - > 4.0 [自作]3.8 - > 4.0 [自作]4.0 - > 4.0 [自作]4.5 - > 5.0 [自作]5.0 - > 5.0 [自作]5.5 - > 6.0