hnwの日記

浮動小数点数の丸め処理を見比べてみる

各種プログラミング言語には、切り上げ・切り捨て・四捨五入など浮動小数点数を丸める関数が何種類もあります。こうした丸め処理を利用する際、「ceilとfloorどっちがどっちだっけ?」「マイナスの数が来た時の挙動って大丈夫なんだっけ?」などと不安になることはないでしょうか。


僕が丸め関数を使うときは、バグが無いかどうか他の場所以上に警戒します。というのも、これらの関数は境界値ピッタリだった場合の挙動とマイナスの数に対する挙動がそれぞれ違っており、勘違いや考え漏れから境界値バグを作り込みやすいためです。僕と同じ感覚の人も多いのではないでしょうか。


本稿では、こうした関数の挙動が一目でわかる便利なグラフを紹介します。このグラフは『WEB+DB PRESS Vol.57』に掲載いただいた僕の記事「PHP転ばぬ先の杖 第2回 数値の正しい扱い方 ― 浮動小数点数、巨大な整数」でも紹介したものです。以下ではPHPの関数4つについて紹介していきますが、他の多くの言語でも共通の話題になると思います。

浮動小数点数の丸め処理とは

浮動小数点数の丸め処理とは、浮動小数点数を決まったルールで整数に変換することです。つまり、切り上げ・切り捨て・四捨五入はいずれも丸め処理ということになります。浮動小数点以下第x位で四捨五入、のようなバリエーションもありますが、今回は整数への丸めに絞って説明していきます。


それでは、intval、floor、ceil、roundの4つのPHP関数について、挙動を確認していきましょう。

続きを読む