rtlopez/decimal

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

1.0.8 2021-06-24 11:16 UTC

This package is not auto-updated.

Last update: 2024-09-27 02:21:29 UTC


README

PHP面向对象的任意精度算术类(>5.3.3)。

test

安装

您可以使用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