PHP 的面向对象 BCMath 包装器

6.2.0 2023-12-16 07:50 UTC

This package is auto-updated.

Last update: 2024-09-16 09:17:42 UTC


README

Contributor Covenant

Maths

此 PHP 包提供了对 bcmath 功能的面向对象包装以及其他处理数字的常见操作。

本项目的一个目标是提高处理浮点数时的精度。

安装

通过 Composer 安装,运行

composer require elliotjreed/maths

或者将依赖项包含在您的 composer.json 文件中,例如

  "require": {
    "php": "^8.1",
    "ext-bcmath": "*",
    "elliotjreed/maths": "^6.1"
  }

使用方法

有两个基础类,NumberNumberImmutable

它们都可以在构造函数中接受任何数值(即一个数值字符串,如 '1.5',一个整数,如 150,一个浮点数,如 1.33,或者一个科学记数法字符串,如 '8.431e-05')。

结果可以返回为字符串、整数或浮点数。

以下是一个关于 NumberNumberImmutable 之间差异的示例

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'

数字可以是 intfloatstringNumber 的实例。

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'

数字可以是 intfloatstringNumber 的实例。

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文件。