rtlopez / decimal
PHP面向对象的不可变任意精度算术库
1.0.8
2021-06-24 11:16 UTC
Requires
- php: >=5.3.0
- ext-bcmath: *
Requires (Dev)
- phpstan/phpstan: ^0.12.90
- phpunit/phpunit: ^8.0
This package is not auto-updated.
Last update: 2024-09-27 02:21:29 UTC
README
PHP面向对象的任意精度算术类(>5.3.3)。
安装
您可以使用Composer
要将此包作为本地、项目级依赖项添加到您的项目中,只需将rtlopez/decimal
依赖项添加到您的项目中的composer.json
文件。以下是一个仅定义对Decimal
依赖项的composer.json
文件的示例
{ "require": { "rtlopez/decimal": "^1.0" } }
特性
Decimal
类可用于任意精度计算。主要特性包括:
- 每次操作的不变结果,
- 相同的精度结果,
- 适合金融计算,
- 流畅的接口,
- 许多单元测试(超过1100个测试和3700个断言),
- 易于使用和安装,
为什么我应该使用它?
Decimal
解决了其他解决方案中已知的一些不便之处。
Float
只是一个近似值,并且具有有限的精度,Fixed-point
具有有限的大小(在64位系统上为64位),- 纯
bcmath
无法正确舍入,只能截断, GMP
不是面向对象的
用法
使用简单工厂创建对象
use RtLopez\Decimal; $n1 = Decimal::create(123, 2); $n2 = Decimal::create(123.45, 2); // not recommended $n3 = Decimal::create('123.45', 2); $n4 = Decimal::create($n1, 2);
打印和格式化数字
$number = Decimal::create('12345.671', 2); echo (string)$number; // 12345.67 echo $number->format(1, ',', ' '); // 12 345,7 echo $number->truncate()->format(null, ',', ' ', false); // 12 345,00
算术
$n1 = Decimal::create('12345.671', 3); $n2 = Decimal::create('11111.111', 3); $n3 = $n1->add($n2)->mul(-1); echo $n3; // -23456.782 // fluid interface $n4 = $n3->pow(2)->sqrt()->mul(-2)->div(2)->abs();
不可变
$n1 = Decimal::create('12345.671', 3); $n1->add(2); ... echo $n1; // 12345.671
比较
$n1 = Decimal::create('12345.671', 3); $n2 = Decimal::create('11111.111', 3); $n1->gt($n2); // true $n1->eq(0); // false $n2->le(100); // false
舍入
$n = Decimal::create('12345.671', 3); echo $n->round(2); // 12345.67 echo $n->round(1); // 12345.7 echo $n->truncate(); // 12345 echo $n->ceil(1); // 12345.6 echo $n->floor(); // 12345
实现
该库存在三种内部实现。
RtLopez\DecimalBCMath
:(默认)基于bcmath库RtLopez\DecimalFixed
:基于缩放整数RtLopez\DecimalFloat
:基于浮点数
只有BCMath
实现可以在广泛的数字范围内正常工作。所有其他实现都可能在不计其实例中失败。它们仅作为概念验证实现,您只能自行承担风险使用它们。
默认实现或精度可以通过函数更改
Decimal::setDefaultImplementation('RtLopez\DecimalBCMath'); Decimal::setDefaultPrecision(6);
许可证
此库根据MIT许可证分发。
问题报告或功能请求
即将推出。
待办事项
- GMP实现
捐赠
BTC: 1Lopez7yPtbyjfLGe892JfheDFJMMt43tW LTC: LV3G3sJxz9AYpDMYUp8e1LCmerFYxVY3ak