MORITOMOMENT

登山好きエンジニアのテックブログ

プログラミング・アウトドア関連を中心に発信

C++言語で少数第n位で四捨五入する

少数第3位で四捨五入をする必要があったので、メモがてらシェアしておきます。

今回やりたいことは、

例えば0.165895235であれば、0.17に四捨五入をしたい。

というように、C++言語で小数点以下のn番目で四捨五入をするにはどうすればいいかシェアします。

C++言語の四捨五入のためのライブラリについて

C++にはcmath.hに四捨五入をする関数が含まれています。

cpprefjp.github.io

こちらの関数の問題は、小数点以下を四捨五入して整数に丸めている点です。

そのため、小数点第n位で四捨五入することはできません。

round関数を使った関数実装

では小数点以下のn番目で四捨五入をする関数を実装していきます。

考え方は次の通りです。

  1. 四捨五入したい数に10の(n-1)乗かける。
  2. その値をround関数で小数点以下を四捨五入する。
  3. 最後に10の(n-1)乗を割る。

この考え方を例でやってみます。

例えば、0.165895235を少数第3位で四捨五入したいとき。

  1. 0.165895235を100倍します(10の(3-1)乗)。すると16.5895235になる。
  2. round関数で小数点以下を四捨五入する。すると17.0になる。
  3. 最後に1/100倍する。すると0.1700になる。

こんな感じに期待した値になってくれそうです。

以上を実装した関数は次の通りです。

#include <stdio.h>
#include <stdlib.h>
#include <cmath>

/* 小数点n以下で四捨五入する */
float round_n(float number, double n)
{
    number = number * pow(10,n-1); //四捨五入したい値を10の(n-1)乗倍する。
    number = round(number); //小数点以下を四捨五入する。
    number /= pow(10, n-1); //10の(n-1)乗で割る。
    return number;
}

/* 以下テスト */

int main(int argc, char const *argv[])
{
    float f1=0.165895235;
    float f2=0.173455;

    printf("%fを少数第3位で四捨五入すると%f\n",f1,round_n(f1,3.0));
    printf("%fを少数第3位で四捨五入すると%f\n",f2,round_n(f2,3.0));
}

上記プログラムの実行結果は

0.165895を少数第3位で四捨五入すると0.170000
0.173455を少数第3位で四捨五入すると0.170000

となり、期待する出力が得られました。

上記プログラムはパッと見た時に何をやっているかわかりやすく冗長に書いたものです。

リファクタリングしがいがありますが、もし同じことをやりたい場合はご参考に!!