PHP の +-*/ を使用して浮動小数点数を計算すると、たとえば、echo intval(0.58*100); では 58 ではなく 57 が出力されるなど、問題が発生する可能性があります。浮動小数点数を正確に表現する際のバグ
は、Python を使用しているときにもこの問題に遭遇しました。したがって、基本的にほとんどの言語は、正確な計算のためにクラス ライブラリまたは関数ライブラリを提供します。たとえば、PHP には、よく使用される BC 高精度関数がいくつかあります。
php BC 高精度関数ライブラリには、加算、比較、除算、減算、剰余、乗算、n 乗、デフォルトの小数点数の設定、および 2 乗が含まれています。これらの関数は、電子商取引の価格計算などの金銭計算の場合にさらに役立ちます。
/**
* 2 つの高精度数値を比較します
*
* @access global
* @param float $left
* @param float $right
* @param int $scale 正確な小数点以下の桁数
*
* @return int $left==$right は 0 を返します | $left<$right は -1 を返します
*/
var_dump(bccomp($left=4.45, $right=5.54, 2));
// -1
/**
* 2 つの高精度数値を追加します
*
* @access global
* @param float $left
* @param float $right
* @param int $scale 正確にするための小数点以下の桁数
*
* @return 文字列
*/
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
//1.04
/**
* 2 つの高精度数値を減算します
*
* @access global
* @param float $left
* @param float $right
* @param int $scale 正確な小数点以下の桁数
*
* @return 文字列
*/
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
//-1.98
/**
* 2 つの高精度数値を除算します
*
* @access global
* @param float $left
* @param float $right
* @param int $scale 正確な小数点以下の桁数
*
* @return 文字列
*/
var_dump(bcdiv($left=6, $right=5, 2));
/ /1.20
/**
* 2 つの高精度数値の乗算
*
* @access global
* @param float $left
* @param float $right
* @param int $scale 正確な小数点以下の桁数
*
* @return 文字列
*/
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
//7.71
/**
* bc関数の小数点以下の桁数を設定します
*
* @access global
* @param int $scale 正確な小数点以下の桁数
*
* @return void
* /
bcscale(3);
var_dump(bcdiv('105', '6.55957'));
// 16.007
注: 設定された桁数については、四捨五入ではなく超過分が破棄されます