elliotjreed / maths
PHP 的面向对象 BCMath 包装器
Requires
- php: ^8.1
- ext-bcmath: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.41
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.5
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.8
README
Maths
此 PHP 包提供了对 bcmath 功能的面向对象包装以及其他处理数字的常见操作。
本项目的一个目标是提高处理浮点数时的精度。
安装
通过 Composer 安装,运行
composer require elliotjreed/maths
或者将依赖项包含在您的 composer.json 文件中,例如
"require": { "php": "^8.1", "ext-bcmath": "*", "elliotjreed/maths": "^6.1" }
使用方法
有两个基础类,Number 和 NumberImmutable。
它们都可以在构造函数中接受任何数值(即一个数值字符串,如 '1.5',一个整数,如 150,一个浮点数,如 1.33,或者一个科学记数法字符串,如 '8.431e-05')。
结果可以返回为字符串、整数或浮点数。
以下是一个关于 Number 和 NumberImmutable 之间差异的示例
use ElliotJReed\Maths\NumberImmutable; use ElliotJReed\Maths\Number; $numberImmutable = new NumberImmutable(10); $newNumberImmutable = $number->multiply(3); $numberImmutable->asFloat(); // 10.0 $newNumberImmutable->asFloat(); // 30.0 $number = new Number(15); $newNumber = $number->multiply(3); $number->asFloat(); // 45.0 $newNumber->asFloat(); // 45.0
Number
Number 对象是可变的。
示例
use ElliotJReed\Maths\Number; $number = new Number('123.5'); $number->multiply(2); $number->add(3); $number->divide(10); $number->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25' $number->asString(1); // '25.0' $number->asString(2); // '25.00' $number->asString(3); // '25.000' $number->isEqualTo(25); // true $number->isLessThan(30); // true $number->isGreaterThan(20); // true $number->isGreaterThanOrEqualTo(25); // true $number->isLessThanOrEqualTo(25); // true $number->isZero(); // false
use ElliotJReed\Maths\Number; $number = new Number(123.5); $number->multiply(2)->add(3)->divide(10)->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25'
数字可以是 int、float、string 或 Number 的实例。
use ElliotJReed\Maths\Number; $number = new Number(123.5); $number->multiply(new Number(2)); $number->add('3'); $number->divide(10.0); $number->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25'
use ElliotJReed\Maths\Number; $number = new Number(10); $anotherNumber = new Number($number); $number->asFloat(); // 10.0 $anotherNumber->asFloat(); // 10.0 $number->add(10)->asFloat(); // 20.0 $anotherNumber->add(5)->asFloat(); // 15.0
use ElliotJReed\Maths\Number; $number = new Number(1.125); $number->roundToDecimalPlaces(2); $number->asFloat(); // 1.13 $number->asInteger(); // 1 $number->asString(); // '1.13'
use ElliotJReed\Maths\Number; $number = new Number(25); $number->squareRoot(); $number->asFloat(); // 5.0 $number->asInteger(); // 5 $number->asString(); // '5'
use ElliotJReed\Maths\Number; $number = new Number(5); $number->raiseToPower(2); $number->asFloat(); // 5.0 $number->asInteger(); // 5 $number->asString(); // '5'
use ElliotJReed\Maths\Number; $number = new Number('25'); $number->increaseByPercentage(10); $number->asFloat(); // 27.5 $number->asInteger(); // 28 $number->asInteger(PHP_ROUND_HALF_DOWN); // 27 $number->asString(); // '27.5' $number->asString(2); // '27.50'
use ElliotJReed\Maths\Number; $number = new Number(5.5); $number->modulus(2.5); $number->asFloat(); // 0.5 $number->asInteger(); // 1 $number->asInteger(PHP_ROUND_HALF_DOWN); // 0 $number->asString(); // '0.5' $number->asString(2); // '0.50'
use ElliotJReed\Maths\Number; $number = new Number('8.431e-05'); $number->asFloat(); // 0.00008431 $number->asString(); // '0.00008431'
NumberImmutable
NumberImmutable 类是不可变的。
示例
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable('123.5'); $number = $number->multiply(2); $number = $number->add(3); $number = $number->divide(10); $number = $number->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25' $number->asString(1); // '25.0' $number->asString(2); // '25.00' $number->asString(3); // '25.000' $number->isEqualTo(25); // true $number->isLessThan(30); // true $number->isGreaterThan(20); // true $number->isGreaterThanOrEqualTo(25); // true $number->isLessThanOrEqualTo(25); // true $number->isZero(); // false
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(123.5); $number = $number->multiply(2)->add(3)->divide(10)->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25'
数字可以是 int、float、string 或 Number 的实例。
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(123.5); $number = $number->multiply(new NumberImmutable(2)); $number = $number->add('3'); $number = $number->divide(10.0); $number = $number->subtract(20); $number->asFloat(); // 25.0 $number->asInteger(); // 25 $number->asString(); // '25'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(1.125); $number = $number->roundToDecimalPlaces(2); $number->asFloat(); // 1.13 $number->asInteger(); // 1 $number->asString(); // '1.13'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(25); $number = $number->squareRoot(); $number->asFloat(); // 5.0 $number->asInteger(); // 5 $number->asString(); // '5'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(5); $number = $number->raiseToPower(2); $number->asFloat(); // 5.0 $number->asInteger(); // 5 $number->asString(); // '5'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable('25'); $number = $number->increaseByPercentage(10); $number->asFloat(); // 27.5 $number->asInteger(); // 28 $number->asInteger(PHP_ROUND_HALF_DOWN); // 27 $number->asString(); // '27.5' $number->asString(2); // '27.50'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable(5.5); $number = $number->modulus(2.5); $number->asFloat(); // 0.5 $number->asInteger(); // 1 $number->asInteger(PHP_ROUND_HALF_DOWN); // 0 $number->asString(); // '0.5' $number->asString(2); // '0.50'
use ElliotJReed\Maths\NumberImmutable; $number = new NumberImmutable('8.431e-05'); $number->asFloat(); // 0.00008431 $number->asString(); // '0.00008431'
开发
入门
预计将安装 PHP 8.1 或更高版本以及 Composer。
安装 Composer
有关如何安装 Composer 的说明,请访问 getcomposer.org。
安装
在克隆此存储库后,切换到新创建的目录并运行
composer install
或者如果您在当前目录中已本地安装了 Composer
php composer.phar install
这将安装项目所需的所有依赖项。
因此,本 README 的其余部分将假定已全局安装 composer(即如果您使用 composer.phar,则需要在终端/命令行中使用 composer.phar 而不是 composer)。
运行测试
单元测试
此项目的单元测试是通过 PHPUnit 进行的。
可以通过执行以下操作运行所有单元测试
composer phpunit
调试
要使 PHPUnit 在遇到第一个失败的测试时停止并报告,请运行
composer phpunit:debug
代码格式化
在团队合作时,代码风格的标准可以很重要,因为它意味着开发者处理他们所阅读的内容时花费的时间会更少(因为一切都将是一致的)。
代码格式化是通过 PHP-CS-Fixer 自动化的。PHP-CS-Fixer 不会格式化构成 PSR-2 编码标准一部分的行长度,因此当通过 PHP Code Sniffer 检查时,这些将产生警告。
可以通过执行以下操作运行这些命令
composer phpcs
运行所有操作
可以通过执行以下操作运行所有测试
composer test
过时的依赖项
可以通过执行以下操作检查过时的 Composer 依赖项
composer outdated
验证 Composer 配置
可以通过执行以下操作来验证 composer.json 的有效性
composer validate --no-check-publish
通过 GNU Make 运行
如果已安装 GNU Make,则可以将上述 composer 命令前缀替换为 make。
可以通过执行以下操作运行所有测试
make test
在持续集成平台(例如:GitHub Actions)上运行测试
包含特定输出格式,这些格式更适合CI平台,作为Composer脚本。
以文本和Clover XML格式输出单元测试覆盖率(可用于例如Coveralls等服务)
composer phpunit:ci
以checkstyle格式输出PHP-CS-Fixer(dry run)和PHPCS结果(GitHub Actions将使用此格式输出可读格式)
composer phpcs:ci
GitHub Actions
查看.github/workflows/main.yml中的示例。
构建使用
许可证
本项目采用MIT许可证 - 有关详细信息,请参阅LICENCE.md文件。