忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

JavaScript 数値の小数点以下の丸め処理(Math.floor, Math.round, Math.ceil)

数値の小数点以下の丸め処理を行うには Math オブジェクトを使います。 Math オブジェクトは数学的な定数と関数を提供する組み込みのプロパティとメソッドを持っています。
今回の丸め処理には、以下の様に切り捨て 四捨五入 切り上げ を行うメソッドがあります。

  • Math.floor() メソッド : 引数として与えた数以下の最大の整数を返します。
  • Math.round() メソッド : 引数として与えた数を四捨五入して、もっとも近似の整数を返します。
  • Math.ceil() メソッド : 引数として与えた数以上の最小の整数を返します。

今回は、これらのメソッドを使って丸め処理の関数を作成してみました。

丸め処理の関数

/*
 * 丸め処理
 *   P_dblVal   : 対象値
 *   P_intRound : 小数点以下丸め処理(1:切り捨て, 2:四捨五入, 3:切り上げ)
 *   return     : 丸めた値
 */
function calcRound(P_dblVal, P_intRound) {
    var dblRet;
    // 丸め処理
    switch (parseInt(P_intRound)) {
        case 1:
          dblRet = Math.floor(P_dblVal);
          break;
        case 2:
          dblRet = Math.round(P_dblVal);
          break;
        case 3:
          dblRet = Math.ceil(P_dblVal);
          break;
        default:
          dblRet = Math.round(P_dblVal);
          break;
    }
    // 戻り値
    return dblRet;
}


上記の関数を実行させてみます。

    console.log('切り捨て:(10.4) = ' + calcRound(10.4, 1));
    console.log('四捨五入:(10.4) = ' + calcRound(10.4, 2));
    console.log('切り上げ:(10.4) = ' + calcRound(10.4, 3));

    console.log('切り捨て:(10.5) = ' + calcRound(10.5, 1));
    console.log('四捨五入:(10.5) = ' + calcRound(10.5, 2));
    console.log('切り上げ:(10.5) = ' + calcRound(10.5, 3));

    console.log('切り捨て:(-10.5) = ' + calcRound(-10.5, 1));
    console.log('四捨五入:(-10.5) = ' + calcRound(-10.5, 2));
    console.log('切り上げ:(-10.5) = ' + calcRound(-10.5, 3));

実行結果がコンソールには以下の結果が表示されます。

切り捨て:(10.4) = 10
四捨五入:(10.4) = 10
切り上げ:(10.4) = 11
切り捨て:(10.5) = 10
四捨五入:(10.5) = 11
切り上げ:(10.5) = 11
切り捨て:(-10.5) = -11
四捨五入:(-10.5) = -10
切り上げ:(-10.5) = -10


小数点以下1位の丸めは出来たのですが、小数点以下2位や3位での丸めはどうすればいいのでしょうか。 方法としては、小数点以下2位での丸めは数値を一旦10倍してから、丸め処理を行いその結果を10で割れば出来るようです。

    var valTest = 10.15;
    console.log('切り捨て:(10.15) = ' + Math.floor(valTest * 10) / 10);
    console.log('四捨五入:(10.15) = ' + Math.round(valTest * 10) / 10);
    console.log('切り上げ:(10.15) = ' + Math.ceil(valTest * 10) / 10);

実行結果がコンソールには以下の結果が表示されます。

切り捨て:(10.15) = 10.1
四捨五入:(10.15) = 10.2
切り上げ:(10.15) = 10.2


これを参考に上記の関数を変更してみます。

丸め処理の関数2(小数点以下桁数の引数追加)

/* 
 * 丸め処理・小数点以下の桁数指定
 *   P_dblVal   : 対象値
 *   P_intRound : 小数点以下丸め処理(1:切り捨て, 2:四捨五入, 3:切り上げ)
 *   P_intDpUnit: 小数点以下桁数
 *   return     : 丸めた値
 */
function calcRoundDp(P_dblVal, P_intRound, P_intDpUnit) {
    var dblRet;
    var dblPow = Math.pow(10, P_intDpUnit);
    P_dblVal = P_dblVal * dblPow;
    // 丸め処理
    switch (parseInt(P_intRound)) {
        case 1:
          dblRet = Math.floor(P_dblVal);
          break;
        case 2:
          dblRet = Math.round(P_dblVal);
          break;
        case 3:
          dblRet = Math.ceil(P_dblVal);
          break;
        default:
          dblRet = Math.round(P_dblVal);
          break;
    }
    // 戻り値
    return dblRet / dblPow;
}


上記の関数を実行させてみます。

    var valTest = 10.15;
    console.log('小数点以下2位を丸め処理');
    console.log('切り捨て:(10.15) = ' + calcRoundDp(valTest, 1, 1));
    console.log('四捨五入:(10.15) = ' + calcRoundDp(valTest, 2, 1));
    console.log('切り上げ:(10.15) = ' + calcRoundDp(valTest, 3, 1));

    console.log('小数点以下1位を丸め処理');
    console.log('切り捨て:(10.15) = ' + calcRoundDp(valTest, 1, 0));
    console.log('四捨五入:(10.15) = ' + calcRoundDp(valTest, 2, 0));
    console.log('切り上げ:(10.15) = ' + calcRoundDp(valTest, 3, 0));

    console.log('1の位を丸め処理');
    console.log('切り捨て:(10.15) = ' + calcRoundDp(valTest, 1, -1));
    console.log('四捨五入:(10.15) = ' + calcRoundDp(valTest, 2, -1));
    console.log('切り上げ:(10.15) = ' + calcRoundDp(valTest, 3, -1));

    console.log('10の位を丸め処理');
    console.log('切り捨て:(10.15) = ' + calcRoundDp(valTest, 1, -2));
    console.log('四捨五入:(10.15) = ' + calcRoundDp(valTest, 2, -2));
    console.log('切り上げ:(10.15) = ' + calcRoundDp(valTest, 3, -2));

実行結果がコンソールには以下の結果が表示されます。

小数点以下2位を丸め処理
切り捨て:(10.15) = 10.1
四捨五入:(10.15) = 10.2
切り上げ:(10.15) = 10.2
小数点以下1位を丸め処理
切り捨て:(10.15) = 10
四捨五入:(10.15) = 10
切り上げ:(10.15) = 11
1の位を丸め処理
切り捨て:(10.15) = 10
四捨五入:(10.15) = 10
切り上げ:(10.15) = 20
10の位を丸め処理
切り捨て:(10.15) = 0
四捨五入:(10.15) = 0
切り上げ:(10.15) = 100


結果から見て、上手く動作している様です。
小数点以下の桁数に大きな値を与えると、関数内の Math.pow で桁あふれが発生する様です。 そのため、桁数指定は10桁以内ぐらいが妥当かと思います。(もっともそこまでの桁数で計算する処理も無いとは思いますが...)












PR

コメント

コメントを書く