【C++】floor / ceil で小数点以下を切り捨て・切り上げする方法

目次

はじめに

C++で浮動小数点数(doublefloat)を扱う際、小数点以下を特定のルールで丸めたい(整数にしたい)場面は頻繁にあります。

標準ライブラリの <cmath> (C言語では <math.h>) ヘッダーには、このための便利な関数が用意されています。

  • std::floor: 床 (floor) の方向、つまり負の無限大方向へ丸めます。(切り捨て
  • std::ceil: 天井 (ceiling) の方向、つまり正の無限大方向へ丸めます。(切り上げ

この記事では、これら2つの関数の基本的な使い方と、正の数と負の数での挙動の違いについて解説します。


floor / ceil を使ったサンプルコード

このコードは、正の数と負の数、それぞれに対して floorceil を適用し、その結果を出力します。

完成コード

#include <iostream>
#include <cmath> // floor, ceil 関数を使うために必要

using namespace std;

int main() {
    double positive_value = 5.7;
    double negative_value = -5.7;

    cout << "--- 正の数の場合 (5.7) ---" << endl;
    // floor: 5.7 を超えない最大の整数 -> 5
    cout << "切り捨て (floor): " << floor(positive_value) << endl;
    // ceil: 5.7 以上の最小の整数 -> 6
    cout << "切り上げ (ceil): " << ceil(positive_value) << endl;

    cout << "\n--- 負の数の場合 (-5.7) ---" << endl;
    // floor: -5.7 を超えない最大の整数 -> -6
    cout << "切り捨て (floor): " << floor(negative_value) << endl;
    // ceil: -5.7 以上の最小の整数 -> -5
    cout << "切り上げ (ceil): " << ceil(negative_value) << endl;
    
    return 0;
}

実行結果

--- 正の数の場合 (5.7) ---
切り捨て (floor): 5
切り上げ (ceil): 6

--- 負の数の場合 (-5.7) ---
切り捨て (floor): -6
切り上げ (ceil): -5

コードの解説

std::floor(x) (切り捨て)

floor (床) 関数は、引数 x超えない最大の整数double 型で返します。数直線をイメージすると、常に左側(小さい方)の整数に丸められます。

  • floor(5.7)5
  • floor(-5.7)-6 ( -5 ではないことに注意)

std::ceil(x) (切り上げ)

ceil (天井) 関数は、引数 x 以上の最小の整数double 型で返します。数直線をイメージすると、常に右側(大きい方)の整数に丸められます。

  • ceil(5.7)6
  • ceil(-5.7)-5

0への切り捨て (trunc)

もし、単純に小数点以下を切り捨てたい(正負を問わず 5.7-5.75-5 にしたい)場合は、trunc (truncate) 関数を使います。

C++

cout << trunc(5.7);  // -> 5
cout << trunc(-5.7); // -> -5

まとめ

今回は、C++の<cmath>ライブラリを使って、浮動小数点数を切り捨て・切り上げする方法を解説しました。

  • floor(x): x を超えない最大の整数(常に小さい方へ)。
  • ceil(x): x 以上の最小の整数(常に大きい方へ)。
  • trunc(x): 0 の方向へ、小数点以下を単純に切り捨てる。

これらの関数は、浮動小数点数から整数への変換ルールを明確にする上で非常に重要です。それぞれの挙動の違い、特に負の数に対する動作を正確に理解し、目的に応じて適切に使い分けましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次