数字的安全操作。

v2.1.3 2020-10-10 16:54 UTC

README

智能 PHP 数字工具

Integrity check codecov Latest Stable Version Latest Unstable Version License: MIT PHPStan Enabled

PHP 库,用于安全地存储和表示数字及其在 PHP 中的等效项。

精确存储许多数字类型(如整数、小数、分数),并将它们相互转换。表达式可以输出为 人类字符串(例如 1/2)或 LaTeX(例如 \frac{1}{2})。

强烈建议您确保在您的 PHP 服务器上已启用 BCMathGMP 扩展,以便进行更快的计算。

安装

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/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

浮点数如何在内存中存储?

参见PHP手册

在维基百科上了解更多关于浮点数的信息

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