四捨五入する | Programming Place Plus C++編 逆引き

トップページC++編逆引き

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

目的 🔗

ある浮動小数点数を、小数点以下で四捨五入したいとします。

小数点の位置以外の箇所で四捨五入を行いたいこともあると思いますが、小数点の位置での四捨五入を行う方法さえ分かっていれば、事前に 10n倍してから計算し、結果を 10-n倍して戻すことで実現できます(ただし、桁溢れには注意してください)。

たとえば、「3.4」は「3」に、「3.5」は「4」になるようにします。また、負数の場合には、「-3.4」は「-3」に、「-3.5」は「-4」になります。

方法①(std::round関数を使う)[C++11~]

C++11以降であれば、標準ライブラリ関数の std::round関数を使うのが簡単です。これは、C言語の C99規格で追加された round関数と同様のものです。

この方法は、C言語編の逆引きで解説しているので、詳細はそちらを参照してください。ここでは、C++ の形で書き直したサンプルプログラムだけ載せておきます。

#include <cmath>
#include <iostream>

int main()
{
    std::cout << std::round(3.4) << std::endl;
    std::cout << std::round(3.5) << std::endl;
    std::cout << std::round(-3.4) << std::endl;
    std::cout << std::round(-3.5) << std::endl;
}

実行結果:

3
4
-3
-4

応用として、小数点以下第2位で四捨五入するには、次のようにします。

#include <cmath>
#include <iostream>

int main()
{
    std::cout << std::round(3.154 * 100) / 100 << std::endl;
    std::cout << std::round(3.155 * 100) / 100 << std::endl;
    std::cout << std::round(-3.154 * 100) / 100 << std::endl;
    std::cout << std::round(-3.155 * 100) / 100 << std::endl;
}

実行結果:

3.15
3.16
-3.15
-3.16

方法②(自力で計算する)[C++03~]

C++03 以前の環境では、自力で計算する必要があります。つまり、「+0.5 してから切り捨てる」という手法を採ります。この方法は、C言語編の逆引きで解説しているので、詳細は、そちらを参照してください。ここでは、C++ の形で書き直したサンプルプログラムだけ載せておきます。

#include <cmath>
#include <iostream>

namespace {
    double my_round(double f)
    {
        if (f >= 0.0) {
            return std::floor(f + 0.5);
        }
        else {
            return -std::floor(-f + 0.5);
        }
    }
}

int main()
{
    std::cout << my_round(3.4) << std::endl;
    std::cout << my_round(3.5) << std::endl;
    std::cout << my_round(-3.4) << std::endl;
    std::cout << my_round(-3.5) << std::endl;
}

実行結果:

3
4
-3
-4

キャストを用いる方法もありますが、C++ では、C言語以上にキャストが嫌われるため、上記の方法を優先するのが良いと思います。


参考リンク 🔗


更新履歴 🔗

 新規作成。



逆引きのトップページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る