Brick/Math 库
最后修改于 2025 年 3 月 19 日
Brick/Math 是一个 PHP 库,用于任意精度算术运算。它允许您使用大数进行精确计算,避免了 PHP 自身的整数和浮点数类型的限制。本教程涵盖了使用 Brick/Math 的基础知识,包括安装、基本操作和高级功能。
安装
要使用 Brick/Math,请通过 Composer 安装它。在您的项目目录中运行以下命令
composer require brick/math
此命令在您的项目中安装 Brick/Math 库。
基本用法
Brick/Math 提供了 BigInteger
和 BigDecimal
类,分别用于处理大整数和十进制数。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use Brick\Math\BigInteger; use Brick\Math\BigDecimal; $bigInt = BigInteger::of('12345678901234567890'); $bigDec = BigDecimal::of('1234567890.1234567890'); echo "BigInteger: " . $bigInt->toString() . "\n"; echo "BigDecimal: " . $bigDec->toString() . "\n";
此示例演示了如何使用 Brick/Math 创建和显示大数。它使用 BigInteger
表示一个巨大的整数,使用 BigDecimal
表示一个精确的十进制数。
of
方法将字符串转换为这些类型,避免了 PHP 的原生类型限制。toString
方法将数字作为字符串输出,确保在显示过程中不会丢失精度。
算术运算
Brick/Math 支持基本算术运算,例如加法、减法、乘法和除法。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use Brick\Math\BigInteger; $a = BigInteger::of('12345678901234567890'); $b = BigInteger::of('98765432109876543210'); $sum = $a->plus($b); $diff = $a->minus($b); $product = $a->multipliedBy($b); $quotient = $a->dividedBy($b); echo "Sum: " . $sum->toString() . "\n"; echo "Difference: " . $diff->toString() . "\n"; echo "Product: " . $product->toString() . "\n"; echo "Quotient: " . $quotient->toString() . "\n";
此代码使用 BigInteger
对两个大整数执行基本算术运算。它计算它们的和、差、积和商。
plus
、minus
、multipliedBy
和 dividedBy
等方法处理运算,而不会损失精度。结果是新的 BigInteger
对象,通过 toString
显示。
十进制精度
BigDecimal
类允许您控制十进制计算的精度和舍入模式。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use Brick\Math\BigDecimal; use Brick\Math\RoundingMode; $a = BigDecimal::of('10'); $b = BigDecimal::of('3'); $result = $a->dividedBy($b, 10, RoundingMode::HALF_UP); echo "Result: " . $result->toString() . "\n";
此示例使用 BigDecimal
以受控精度将 10 除以 3。它将小数位设置为 10 位,并使用 HALF_UP 舍入。
dividedBy
方法接受除数、小数位数和舍入模式。在这里,它产生 "3.3333333333",避免了 PHP 本机类型中常见的浮点错误。
比较操作
Brick/Math 提供了用于比较数字的方法,例如 isEqualTo
、isGreaterThan
和 isLessThan
。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use Brick\Math\BigInteger; $a = BigInteger::of('12345678901234567890'); $b = BigInteger::of('98765432109876543210'); if ($a->isLessThan($b)) { echo "$a is less than $b\n"; } else { echo "$a is not less than $b\n"; }
此代码比较两个 BigInteger
值以检查它们的顺序。它使用 isLessThan
确定一个是否小于另一个。
比较方法返回布尔值,非常适合条件逻辑。在这里,它正确地输出 12345678901234567890 小于 98765432109876543210。
高级功能
Brick/Math 还支持高级功能,例如模算术、求幂和阶乘计算。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use Brick\Math\BigInteger; $a = BigInteger::of('12345678901234567890'); $b = BigInteger::of('98765432109876543210'); $mod = $a->mod($b); $power = $a->power(3); $factorial = BigInteger::of(100)->factorial(); echo "Modulus: " . $mod->toString() . "\n"; echo "Power: " . $power->toString() . "\n"; echo "Factorial: " . $factorial->toString() . "\n";
此示例展示了高级的 BigInteger
运算:模运算、求幂和阶乘。它使用大数来演示功能。
mod
方法计算 $a 除以 $b 的余数。power
方法将 $a 提升到 3 次方,而 factorial
计算 100!,所有这些都具有精确的精度。
这些运算在需要精度和大数的密码学、科学计算或金融应用程序中很有用。结果以字符串形式输出,以提高可读性。
Brick/Math 的最佳实践
- 使用字符串进行初始化: 从字符串初始化
BigInteger
和BigDecimal
对象以避免精度损失。 - 控制精度: 为十进制计算指定精度和舍入模式,以确保结果准确。
- 使用不可变对象: Brick/Math 对象是不可变的,因此始终将运算结果分配给一个新变量。
- 优化性能: 避免不必要的计算,并对大数使用有效的算法。
来源
在本教程中,我们探讨了如何在 PHP 中使用 Brick/Math 库进行任意精度算术运算。Brick/Math 提供了强大的工具,用于使用大数执行精确计算,使其非常适合金融、科学和加密应用程序。
作者
列出 所有 PHP 教程。