はじめに
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
nix develop
が使えない際のトラブルシューティング
https://students-tech.blog/post/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
- Ubuntu Packages
https://packages.ubuntu.com/plucky/php8.4-bcmath
参考
BCMath 任意精度数学関数
https://www.php.net/manual/ja/book.bc.phpUbuntu Packages
https://packages.ubuntu.com/plucky/php8.4-bcmathnix develop
が使えない際のトラブルシューティング
https://students-tech.blog/post/nix-develop
おわりに
業務で数年前のコードをリファクタリングする機会があったのだが、精密な計算をする部分でfloat
やdouble
の浮動小数点を使っていた。
任意精度計算を使うbcmath
を使うように修正する必要があったので、今回はサンプルを試してみた。