S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

まだまだ四捨五入

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