PHPの演算誤差

(3/3)

任意精度で四捨五入

前述の循環小数問題を回避するため、丸め(四捨五入)を行うことにする。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説

0001: <?php
0002: /** marginerror3.php
0003:  * BCMath任意精度数学関数を利用した四捨五入
0004:  * @copyright (c)studio pahoo
0005:  * @author     パパぱふぅ
0006:  * @version     1.0 2006/12/06
0007: */
0008: 
0009: /**
0010:  * 任意精度の丸め関数
0011:  * @param string    $val 丸める数字
0012:  * @param int        $precision 丸め位置(小数点の桁数)
0013:  * @return string    結果の数字
0014: */
0015: function bcround($val$precision) {
0016:     $x = bcdiv($val$precision);
0017:     $x = round($x, 1);
0018:     return bcmul($x,  $precision);
0019: }
0020: 
0021: bcscale(10);       //有効桁数を10桁にする
0022: //循環小数
0023: $a = 1;
0024: $b = 3;
0025: $x = bcdiv($a$b);
0026: printf("%s÷%s=%f<br />\n", $a$b$x);
0027: $x = bcmul($x$b);
0028: $x = bcround($x, 1);
0029: printf("%s÷%s×%d=%d<br />\n", $a$b$b$x);
0030: ?> 

ここでは、任意精度を扱える bcround をユーザー定義した(9~19行目)。
これで、期待通りの数値を得ることができるようになった。実際のプログラミングの場面では、bcround は万能ではなく、用途に応じた丸め関数を用意することになるだろう。そのときも、ここで定義した bcround 関数のコーディング方法が役に立つと思う。

参考書籍

(この項おわり)
header