HOWTO · C++
C++ で float を int に変換する方法
この記事では、C++ で float を int に変換する方法を紹介します。
このページの内容
C++ の float を int に変換して小数部分を破棄するには、static_cast<int>(value) を使用します。浮動小数点数から整数への変換はゼロ方向に切り捨てます。4.8f は 4 になり、-4.8f は -4 になります。別の丸め規則が必要な場合は、変換する前に <cmath> の関数を選択してください。
直接代入を使用して float を int に変換する
直接代入は float を暗黙的に int に変換します。小数部分は破棄されます。馴染みのある値を代入し、変換後の整数を表示するコンパクトなプログラムを次に示します。
#include <iostream>
int main() {
float value = 4.8f;
int result = value;
std::cout << result << '\n';
}
C++ の変換セマンティクスにより、4.8f に対する整数値は 4 になります。この例は次のように出力します。
4
負の入力でも切り捨てはゼロ方向に進むため、-4.8f は床の値 -5 ではなく -4 に変換されます。
C スタイルのキャストを使用して float を int に変換する
C スタイルのキャストは、int result = (int)value; のように対象の型を括弧内に書きます。スカラーの浮動小数点値については、変換後の値が int として表現可能であれば、直接代入や static_cast<int>(value) と同じゼロ方向への切り捨て結果を生成します。
C スタイルのキャストは複数種類の変換を表現できるため、その効果は一見してあまり明示的ではありません。現代の C++ では、これが意図する変換である場合は static_cast<int>(value) を優先してください。C スタイルの記法は既存のコードで認識するのに役立ちますが、浮動小数点値が切り捨てられる方法は変わりません。
static_cast を使用して float を int に変換する
static_cast<int>(value) を使用して変換を明示し、その宛先の型を特定します。浮動小数点値については、static_cast はゼロ方向に切り捨てます。最も近い整数に丸めたり、結果が int に収まるかどうかを確認したりはしません。
切り捨て後の値が int で表現できない場合、その変換は未定義の動作となります。変換前に元の値が int の制限内にあることを確認することは控えめな保護策です。切り捨て結果がなお収まる一部の小数値を拒否する場合があります。static_cast は値を制限したり検証したりしません。言語の規則や、この演算子がサポートするその他の変換については、static_cast のリファレンスを参照してください。
丸め戦略を使用して float を int に変換する
ゼロ方向への切り捨てが望ましい結果でない場合は、丸め関数を選択してください。<cmath> をインクルードし、その結果を int に変換する前にその関数を適用します。丸められた値も int として表現可能でなければなりません。
切り捨て(Floor)
std::floor(value) は、入力以下の最大の整数値を返します。たとえば、floor は 4.8f に対して 4 を、-4.8f に対して -5 を返します。これは、int への直接変換がそれぞれ 4 と -4 を返すこととは異なります。floor の結果を整数として格納するには、範囲内にあることを確認した後で static_cast<int>(std::floor(value)) を使用します。
切り上げ(Ceil)
std::ceil(value) は、入力以上の最小の整数値を返します。4.8f に対して 5 を、-4.8f に対して -4 を返します。整数が必要で結果が int に収まる場合は、その結果を static_cast<int>(std::ceil(value)) で変換します。
最も近い整数への丸め
std::round(value) は最も近い整数値を選択し、中間の場合はゼロから離れる方向に丸めます。したがって、std::round(4.5f) は 5 で、std::round(-4.5f) は -5 です。整数を取得するには static_cast<int>(std::round(value)) を使用し、丸められた結果が表現可能であることを再度確認します。この規則は、特に負の入力において、切り捨て、floor、ceil とは異なります。
結論
通常の float から int への変換では、static_cast<int>(value) によって意図が明確になり、ゼロ方向に切り捨てられます。直接代入と C スタイルのキャストは、適切な値については同じ切り捨て動作をしますが、名前付きのキャストの方が意図的な C++ の変換として認識しやすくなります。それぞれの丸め規則がタスクに合う場合は、<cmath> の std::floor、std::ceil、または std::round を使用してください。どの変換を行う前にも、切り捨てや丸めによって生成される値が int の範囲に収まることを確認してください。これらのキャストはいずれも、あなたに代わってそれを確認したり調整したりしません。