[PHP] PHPで任意精度計算

2018年1月22日月曜日

PHP

BC Math

PHPでは小数を含めて、任意精度で計算をしたい場合はBC Math関数を使う。
http://php.net/manual/ja/book.bc.php

こんな感じで。
bcdiv('123.45', '78.90', 10);      // 1.5646387832

2値を比較する場合はbccompを使う。
if (bccomp($a, $b) === 0)
ただし、指定されたスケールまでしか比較しないので、要注意。
各演算のスケールはオプションの引数で指定できるけど、指定しなかった場合のデフォルトスケールはbcscaleで設定できる。
bccomp('123.456', '123.457');     // 0
bccomp('123.456', '123.457', 3);  // -1

bcscale(3);
bccomp('123.456', '123.457');     // -1
※PHP起動時のデフォルトスケールは0になっているのが分かる。

最初はJavaなんかと同じようにクラスで表現されているのかと思ったけど、BC Math関数のインターフェイスは文字列になっている。

可搬性のあるデータとして、文字列を使ってしまうというのはクラスを使って表現するのとは対極にある考え方かもしれないけど、反面かなり汎用性のあるやり方でもある。