PHP的一个面向对象、不可变、任意精度算术库

v1.0 2017-12-22 13:49 UTC

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