hypetechpl / php-decimal
PHP 的任意精度十进制类类型。
Requires
- php: ^7.3 || 8.0 || ^8.3
- ext-bcmath: ^7.3 || ^8.3
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is not auto-updated.
Last update: 2024-09-21 08:12:12 UTC
README
这个库类似于 decimal.js,所有业务逻辑的著作权和版权归 Michael Mclaughlin 及其 贡献者 所有。
piggly/php-decimal
完全兼容 PHP,并且与 decimal.js 库一样快速。下面列出了与之相关的所有功能。
功能
此库主要由 Decimal
类组成。一个 Decimal
由系数、指数和符号组成。它可以处理任意精度的整数和浮点数。
这里的精度是以有效数字而不是小数位数来指定的,所有计算都四舍五入到精度(类似于 Python 的 decimal 模块),而不仅仅是涉及除法的计算。
此库还添加了三角函数等,并支持非整数幂,这使得它成为一个功能更强大的库。
- 整数和浮点数;
- 简单但功能齐全的 API;
- 复现了许多原生数学方法;
- 还处理十六进制、二进制和八进制值;
- 比其他 PHP 库更快、更易于使用;
- 无依赖项或要求;
- 全面的文档和测试套件。
用法
Decimal
可以处理整数、浮点数、字符串和 Decimal
对象。
$w = new Decimal(123); $x = new Decimal(123.4567); $y = new Decimal('123456.7e-3'); $z = new Decimal($x);
如果包含适当的前缀,值也可以是二进制、十六进制或八进制。
$w = new Decimal('0xff.f'); // '255.9375' $x = new Decimal('0b10101100'); // '172'
Decimal
是不可变的,意味着它不会被其方法更改,总是返回一个新的 对象
。
$x = new Decimal(0.3); $x->minus(0.1); // $x is still 0.3 $y = $x->minus(0.1)->minus(0.1); // $x is still 0.3 and $y is 0.1
所有返回 Decimal
值的方法都可以链式调用。
$x->dividedBy($y)->plus($z)->times(9)->floor(); $x->times('1.23456780123456789e+9')->plus(9876.5432321)->dividedBy('4444562598.111772')->ceil();
许多方法名都有简短的别名。
$x->squareRoot()->dividedBy($y)->toPower(3)->equals($x->sqrt()->div($y)->pow(3)) // true $x->cmp($y->mod($z)->neg()) == 1 && x->comparedTo($y->modulo($z)->negated()) == 1 // true
有多种方法可以将 Decimal
转换为字符串。
$x = new Decimal(255.5); $x->toExponential(5) // '2.55500e+2' $x->toFixed(5) // '255.50000' $x->toPrecision(5) // '255.50' $x->valueOf() // '255.5'
几乎所有方法都作为 static
提供。
Decimal::sqrtOf('6.98372465832e+9823') // '8.3568682281821340204e+4911' Decimal::powOf(2, 0.0979843) // '1.0702770511687781839'
Decimal
可以处理 INF
和 NAN
值。
$x = new Decimal(INF); // INF $y = new Decimal(NAN); // NAN
有许多方法可以对 Decimal
进行任何检查。
$x->isCountless() // If it is INF or NAN $x->isFinite() // If it is a finite number $x->isInfinite() // If it is an infinite number $x->isInt() // If it is an integer $x->isNaN() // If it is NAN $x->isNegative() // If it is negative $x->isNulled() // If it is INF, NAN or Zero $x->isPositive() // If it is positive $x->isZero() // If it is zero
顺便说一句,有一个可选的最大分母参数的 toFraction
方法。
$z = new Decimal(355); $pi = $z->dividedBy(113); // '3->1415929204' $pi->toFraction(); // [ '7853982301', '2500000000' ] $pi->toFraction(1000); // [ '355', '113' ]
所有计算都根据 DecimalConfig
对象的 precision
和 rounding
属性指定的有效数字数和舍入模式进行舍入。
每个 Decimal
类都与一个 DecimalConfig
相关。它可能是 global
配置,或者针对特定十进制数的自定义配置。
对于高级使用,可以创建多个 Decimal
,每个都具有自己的独立配置,该配置适用于从它创建的所有 Decimal
数。
// Set the precision and rounding of the global instance, // applies to all Decimal objects without configurations attached to it. DecimalConfig::instance()->set([ 'precision' => 5, 'rounding' => 4 ]); $decimal9 = DecimalConfig::clone()->set([ 'precision' => 9, 'rounding' => 1 ]); $x = new Decimal(5); $y = new Decimal(5, $decimal9); $x->div(3); // '1.6667' $y->div(3); // '1.66666666' // $decimal9 applies to all `Decimal` numbers // created from $y in this case $y->div(3)->times(1.5) // '2.50000000'
Decimal
对象的值以其 digits
、exponent
和 sign
为浮动点格式存储。
$x = new Decimal(-12345.67); $x->getDigits(); // [ 12345, 6700000 ] digits (base 10000000) $x->getExponent(); // 4 exponent (base 10) $x->getSign(); // -1 sign
有关更多信息,请参阅文档目录中的 API 参考,目前您可以访问 decimal.js API,因为此库与它完全兼容。
安装
Composer
- 在您控制台的项目文件夹中,键入
composer require piggly/php-decimal
; - 别忘了在您的代码库中添加 Composer 的自动加载文件
require_once('vendor/autoload.php');
。
手动安装
- 使用
git clone https://github.com/piggly-dev/php-decimal.git
下载或克隆存储库; - 然后,转到
cd /path/to/piggly/php-decimal
; - 使用
composer install
安装所有 Composer 依赖项。 - 将项目的自动加载文件添加到您的代码库中
require_once('/path/to/piggly/php-decimal/vendor/autoload.php');
。
依赖项
该库有以下外部依赖
- PHP 7.3+。
待办事项
在代码中,有标记为 @todo
的注释,表示该库可能需要的改进。
变更日志
有关所有代码更改的信息,请参阅 变更日志 文件。
代码测试
该库使用 PHPUnit。我们对本应用程序的所有主要类进行了测试。
vendor/bin/phpunit
您必须始终使用 PHP 7.3 及以上版本运行测试。此库的任何更改都需要通过所有最老的和最新的测试。
!! 一些测试很重,测试时要小心,它们可能需要大量的可用内存。
贡献
在提交您的贡献之前,请参阅 贡献 文件以获取信息。
致谢
decimal.js
支持项目
Piggly Studio 是一家位于巴西里约热内卢的机构。如果您喜欢这个库并想支持这项工作,请自由地向 BTC 钱包 3DNssbspq7dURaVQH6yBoYwW3PhsNs8dnK
捐款 ❤。
许可证
MIT 许可证(MIT)。请参阅 许可证。