四捨六入について

こんにちは!エンジニアのA.Yです。
今回は、端数処理についてお話しようかと思います。

四捨五入

一般的な端数処理と言えば四捨五入になるかと思います。
一応例を出しておくきます。

A: 50.045 → [小数点第2位で四捨五入] → 50
B: 49.955 → [小数点第2位で四捨五入] → 50

はい、これは小学生でもわかりますね。

四捨五入の問題点

例えば以下の様なデータがあるとします。

A: 50.045%
B: 49.955%

そして、小数点第3位を四捨五入すると

A:50.05%
B:49.96%

となり、その和が100.01となってしまいました。
web制作においてこのようなことが起こると困ることが多々あります。
例えば、合計を100%とするグラフやチャートを表示させようとする時などです。

四捨六入(五捨五入)

端数処理では可能な限り元の数字に近い数にするのがベターですが、
完璧に行うことは不可能です。

四捨五入と似たような端数処理で四捨六入という方法があります。
四捨六入というのは、読んで名のごとく4以下を切り捨てて、6以上を繰り上げるというものです。
そして、5の場合ですがひとつ上の桁の値が偶数だったら切り捨て、奇数だったら繰り上げる…という処理をします。
例えば、最初に上げた例の数値を四捨六入してみます。

A: 50.045%
B: 49.955%

A: 50.04%
B: 49.96%

Aは一つ上の桁が4(偶数)だったので切り捨て、Bは一つ上の桁が5(奇数)だったので繰り上げました。
これによりその和が100となりました。

今回はたまたまうまくいきましたが、勿論毎回うまくいくとは限りません。
しかし、四捨六入は四捨五入よりも精度が高いのは確かなのです。

0と10の中間の数値である5を必ず切り上げたり(四捨五入)、切り下げたり(五捨六入)すると偏りが生じてしまうのは当然で、この5を平等に振り分けることにより精度をあげるのが四捨六入という方法なのです。

四捨六入の関数

PHPは四捨五入をする関数「round」で四捨六入ができます。
第三引数に「PHP_ROUND_HALF_DOWN」を指定するだけです。

					//四捨五入
					echo round(3.25, 1);         // 3.3
					echo round(3.35, 1);         // 3.4

					//四捨六入
					echo round(3.25, 1, PHP_ROUND_HALF_EVEN);         // 3.2
					echo round(3.35, 1, PHP_ROUND_HALF_EVEN);         // 3.4
				

まとめ

端数処理の方法は四捨五入が一般的ですが、大量のデータを処理したりする場合等でより精度の高い端数処理をもとめられる場合などは、一般的な四捨五入以外の方法を試してみるのがいいと思います。
今回はその1つである四捨六入を紹介しました。