PHPで任意精度を扱えるbcmathを使う

はじめに

PHPの拡張機能としてある任意精度計算のbcmathを使ってみる。

環境

nix
php 8.4
bcmath

準備

  • nix パッケージマネージャがインストール済み

今回は、nixで開発環境を構築するので以下のファイルを適当なディレクトリに置く。

shell.nix
{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  buildInputs = [
    pkgs.php84
  ];

  shellHook = ''
    echo "PHP 8.4 開発環境へようこそ!"
    echo "PHP バージョン: $(php -v | head -n 1)"
  '';
}

flakeを使う場合下記も必要

flake.nix
{
  description = "PHP 8.4 開発環境";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; # 24.11チャンネルを使用
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;
        };
      in
      {
        devShells.default = import ./shell.nix { inherit pkgs; };
      });
}
nix-shell

# flakeの場合
nix develop

確認

以下のファイルを用意する。

test.php
<?php
// PHP 8.4の機能をテストするファイル

// PHPのバージョン情報を表示
echo "PHP バージョン: " . phpversion() . "\n";

// クラス定義の例
class TestClass {
    public readonly string $property;
    
    public function __construct(string $value) {
        $this->property = $value;
    }
}

// インスタンス作成
$test = new TestClass("PHP 8.4 テスト");
echo "プロパティ値: " . $test->property . "\n";

// その他のPHP 8.4特有の機能をここでテスト

echo "テスト完了\n";
php -f test.php
結果
PHP 8.4 開発環境へようこそ!
PHP バージョン: PHP 8.4.7 (cli) (built: May  6 2025 12:31:58) (NTS)

bcmathを使ったサンプル

bcmath.php
<?php
// bcmath拡張を使ったサンプル

$a = '123456789123456789';
$b = '987654321987654321';

// 加算
$sum = bcadd($a, $b);
echo "加算: $a + $b = $sum\n";

// 減算
$diff = bcsub($b, $a);
echo "減算: $b - $a = $diff\n";

// 乗算
$mul = bcmul($a, $b);
echo "乗算: $a * $b = $mul\n";

// 除算(小数点以下10桁まで表示)
$div = bcdiv($b, $a, 10);
echo "除算: $b / $a = $div\n";

// べき乗
$pow = bcpow($a, '2');
echo "べき乗: $a ^ 2 = $pow\n";

// 剰余
$mod = bcmod($b, $a);
echo "剰余: $b % $a = $mod\n";
?>
php -f bcmath.php
結果
加算: 123456789123456789 + 987654321987654321 = 1111111111111111110
減算: 987654321987654321 - 123456789123456789 = 864197532864197532
乗算: 123456789123456789 * 987654321987654321 = 121932631356500531347203169112635269
除算: 987654321987654321 / 123456789123456789 = 8.0000000729
べき乗: 123456789123456789 ^ 2 = 15241578780673678515622620750190521
剰余: 987654321987654321 % 123456789123456789 = 9000000009

補足: Ubuntuで使う場合

sudo apt search php8.4-bcmath
sudo apt install php8.4-bcmath

参考

おわりに

業務で数年前のコードをリファクタリングする機会があったのだが、精密な計算をする部分でfloatdoubleの浮動小数点を使っていた。
任意精度計算を使うbcmathを使うように修正する必要があったので、今回はサンプルを試してみた。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。