mathematicator-core / numbers
数字的安全操作。
Requires
- php: >=7.2
- ext-json: *
- brick/math: ^0.8.15 || ^0.9.0
- nette/utils: ^3.0
- symfony/polyfill-php80: ^1.17
Requires (Dev)
- brainmaestro/composer-git-hooks: dev-master
- nette/tester: ^2.3
- phpstan/phpstan: ^0.12.18
- phpstan/phpstan-nette: ^0.12.6
Suggests
- ext-bcmath: For faster math operations
- ext-gmp: Alternative for faster math operations
This package is auto-updated.
Last update: 2024-08-30 01:23:23 UTC
README
智能 PHP 数字工具
PHP 库,用于安全地存储和表示数字及其在 PHP 中的等效项。
精确存储许多数字类型(如整数、小数、分数),并将它们相互转换。表达式可以输出为 人类字符串(例如 1/2
)或 LaTeX(例如 \frac{1}{2}
)。
强烈建议您确保在您的 PHP 服务器上已启用 BCMath 或 GMP 扩展,以便进行更快的计算。
安装
composer require mathematicator-core/numbers
功能
- SmartNumber - 对所有数字类型具有任意精度的统一安全存储。支持比较。
- Entity\Number - 具有基本功能的更少魔法的通用任意精度数字存储。
- 分数
- Entity\Fraction - 用于存储由数字和其他表达式组成的简单或复合分数。
- Entity\FractionNumbersOnly - 用于仅由数字组成的简单或复合分数的存储,可以直接计算。
- LaTeX 支持: (什么是 LaTeX?)
- MathLatexBuilder - 使用流畅的接口以简单的方式创建有效的 LaTeX 数学表达式。
- MathLatexToolkit - LaTeX 表达式的静态库(包括常数、函数、运算符等)
- MathLatexSnippet - LaTeX 语法的存储。
- 人类字符串支持
- MathHumanStringBuilder - 与 MathLatexBuilder 相同的接口,但生成人类字符串
- MathHumanStringToolkit - 与 MathLatexToolkit 相同的接口,但生成人类字符串(例如
1/2*(3+1)
)
- 集合生成器
- 素数
- 偶数
- 奇数
- 转换器
- 数组到分数及其反向转换
- 十进制到分数
- 分数到人类字符串
- 分数到 LaTeX
- 整数到罗马数字及其反向转换
- 计算 - 简单的算术运算(brick/math 装饰器)
💡 提示:您可以使用 mathematicator-core/tokenizer 对用户输入字符串进行高级 标记化 或 mathematicator-core/calculator 进行高级 计算。
用法
use Brick\Math\RoundingMode; use Mathematicator\Numbers\SmartNumber; $smartNumber = SmartNumber::of('80.500'); echo $smartNumber->toBigDecimal(); // 80.500 echo $smartNumber->toFraction()->getNumerator(); // 161 echo $smartNumber->toFraction()->getDenominator(); // 2 echo Calculation::of($smartNumber)->multipliedBy(-4); // -322.000 echo Calculation::of($smartNumber)->multipliedBy(-4)->abs()->getResult()->toInt(); // 322 echo $smartNumber->toBigDecimal()->toScale(0, RoundingMode::HALF_UP); // 81 $smartNumber2 = SmartNumber::of('161/2'); echo $smartNumber2->toHumanString(); // 161/2 echo $smartNumber2->toHumanString()->plus(5)->equals('90.5'); // 161/2+10=90.5 echo $smartNumber2->toLatex(); // \frac{161}{2} echo $smartNumber2->toBigDecimal(); // 80.5
推荐的库
对于处理任意长度数字的安全操作,我们建议使用
- brick/math - 具有简单界面的 PHP 任意精度算术库。
- PHP BC Math 扩展 - 用于任意精度计算的本地 PHP 扩展。
处理金钱
如果您在应用程序中处理金钱,请使用以下其中一个库。
- brick/money - 具有类似 brick/math 接口的货币和货币库。
- moneyphp/money - 广泛采用的 PHP 实现,遵循 Fowler 的 Money 模式。
为什么浮点数不安全?
浮点数将您的数字存储为近似值,精度有限。
您永远不应该相信浮点数到最后一位数。如果您依赖精度(不仅是货币计算),请勿直接使用浮点数进行等价性检查。
示例
$result = 0.1 + 0.2; echo $result; // output: 0.3 echo ($result == 0.3) ? 'true' : 'false'; // output: false
Mathematicator框架工具结构
最大的优势是您可以立即选择最适合您需求的层,并在其之上开始构建,无需自己创建一切。我们的工具经过错误测试和性能调优,因此您可以节省大量的时间、金钱和精力。
框架尽可能模块化,因此您应该能够为每一层及其子层创建扩展。
Mathematicator框架层 按从最具体到最抽象的顺序排列
第三方包
⚠️ 不保证!
贡献
请通过发送Pull请求来帮助我们改进此文档。
测试
所有新的贡献都应该在其/tests
目录中包含单元测试。
在您发送PR之前,请确保所有测试都通过。
此包使用Nette Tester。您可以通过以下命令运行测试
composer test
对于基准测试,我们使用phpbench。您可以通过这种方式运行基准测试
composer global require phpbench/phpbench @dev # only the first time
phpbench run
在PR之前,请通过命令运行完整的代码检查
composer cs:install # only the first time composer fix # otherwise pre-commit hook can fail