egorsmkv-packagist / decimal
PHP的一个面向对象、不可变、任意精度算术库
v1.0
2017-12-22 13:49 UTC
Requires
- php: >=5.3.0
- ext-bcmath: *
Requires (Dev)
- phpunit/phpunit: 4.0.*
This package is not auto-updated.
Last update: 2024-09-29 04:20:22 UTC
README
PHP的一个面向对象、任意精度算术类(>5.3.3)。
安装
您可以使用 Composer
要将此包添加为项目本地依赖,只需将 rtlopez/decimal
添加到您的项目 composer.json
文件中的依赖项即可。以下是一个定义 Decimal
依赖项的 composer.json
文件的最小示例
{ "require": { "rtlopez/decimal": "dev-master" } }
功能
Decimal
类可用于任意精度计算。主要功能包括:
- 每个操作的结果不可变,
- 相同的精度结果,
- 适用于金融计算,
- 流畅的接口,
- 许多单元测试(超过1100个测试和3700个断言),
- 易于使用和安装,
为什么我应该使用它?
Decimal
解决了其他解决方案中已知的一些不便。
Float
只是一个近似值,并且具有有限的精度,定点数
具有有限的大小(在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(); // 12346
实现
该库存在三种内部实现。
RtLopez\DecimalBCMath
:(默认)基于 bcmath 库RtLopez\DecimalFixed
:基于缩放整数RtLopez\DecimalFloat
:基于浮点数
只有 BCMath
实现可以在广泛的数字范围内正确工作。其他所有实现都可能在许多边界情况下失败。它们仅作为概念证明实现,并且您只能承担自己的风险使用它们。
可以通过函数更改默认实现或精度
Decimal::setDefaultImplementation('RtLopez\DecimalBCMath'); Decimal::setDefaultPrecision(6);
许可证
此库在 MIT 许可证下分发。
问题报告或功能请求
即将推出。
待办事项
- GMP 实现
捐赠
BTC: 1Lopez7yPtbyjfLGe892JfheDFJMMt43tW LTC: LV3G3sJxz9AYpDMYUp8e1LCmerFYxVY3ak