ある数単位での切り上げ、切り捨て、四捨五入

切り上げ、切り捨て、四捨五入というのは整数単位であったり、特定の桁数であったりしますが、ある数値に対しての切り上げ、切り捨て、四捨五入を計算してみます。

具体的には、0.03 という数字を 0.02 単位で丸める際に、0.02 に対して切り上げ、切り捨て、四捨五入の処理を行います。

#! /usr/local/bin/nawk -f
# ceil_round_floor.awk
# usage: nawk -f ceil_round_floor.awk

BEGIN {

    print ceil2(0.03, 0.02);
    print round2(0.03, 0.02);
    print floor2(0.03, 0.02);

    print ceil2(0.00, 0.02);
    print round2(0.00, 0.02);
    print floor2(0.00, 0.02);

    print ceil2(-0.03, 0.02);
    print round2(-0.03, 0.02);
    print floor2(-0.03, 0.02);

    # Ref. http://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86
    print ceil2(3.7, 1);
    print round2(3.7, 1);
    print floor2(3.7, 1);

    print ceil2(-3.7, 1);
    print round2(-3.7, 1);
    print floor2(-3.7, 1);
}

# ceil2:    ある数単位で切り上げる関数
#   in:     数値 num1
#           数値 num2
#   out:    数値 num1 を数値 num2 単位で切り上げた数値
function ceil2(num1, num2) {
    if (num1 >= 0) {
        return (num1 % num2) ? int((num1 + num2) / num2) * num2 : num1;
    } else {
        return int(num1 / num2) * num2;
    }
}

# round2:   ある数単位で四捨五入する関数
#   in:     数値 num1
#           数値 num2
#   out:    数値 num1 を数値 num2 単位で四捨五入した数値
function round2(num1, num2) {
    if (num1 >= 0) {
        return int((num1 + num2 / 2) / num2) * num2;
    } else {
        return int((num1 - num2 / 2) / num2) * num2;
    }
}

# floor2:   ある数単位で切り捨てる関数
#   in:     数値 num1
#           数値 num2
#   out:    数値 num1 を数値 num2 単位で切り捨てた数値
function floor2(num1, num2) {
    if (num1 >= 0) {
        return int(num1 / num2) * num2;
    } else {
        return (num1 % num2) ? int((num1 - num2) / num2) * num2 : num1;
    }
}

では、実行してみましょう。

$ gawk -f ceil_round_floor.awk
0.04
0.04
0.02
0
0
0
-0.02
-0.04
-0.04
4
4
3
-3
-4
-4

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png