romainnorberg/residue

将浮点数分成几个部分,并分配任何余数

v0.4 2023-08-25 03:12 UTC

This package is auto-updated.

Last update: 2024-09-25 05:33:10 UTC


README

Latest Version on Packagist GitHub Tests Action Status codecov Total Downloads

将浮点数分成几个部分,并分配任何余数。

Residue Package - Illustration credit: https://refactoring.guru/

简介

此无依赖项包提供了一个 split 方法,帮助您将浮点数分成部分,并可能分配任何余数。

还可以指定分割金额的舍入,例如,舍入到0.05。

🕹 在在线测试器上试用Residue! »

安装

您可以通过composer安装此包

composer req romainnorberg/residue

要求

此包需要 >= PHP 7.4

Residue VS Brick\Money

此包不涉及货币的概念,并且更基础,在基本操作上比brick/money包快40倍

基准测试:residue-vs-brick-money

使用/示例

基本分割

Residue::create(100)->divideBy(3)->split(); // -> \Generator[33.34, 33.33, 33.33]

// or

Residue::create(100)->divideBy(3)->toArray(); // -> [33.34, 33.33, 33.33]

带有舍入(和余数)的分割

Residue::create(100)
            ->divideBy(3)
            ->step(0.05)
            ->split(); // -> \Generator[33.35, 33.35, 33.30]

带余数

$r = Residue::create(7.315)
                ->divideBy(3)
                ->step(0.05);

$r->split(); // -> \Generator[2.45, 2.45, 2.40]
$r->getRemainder(); // -> 0.015

分割模式

SPLIT_MODE_ALLOCATE 是默认模式,并尝试根据步长分配最大值。

$r = Residue::create(100)
            ->divideBy(3)
            ->decimal(0);

$r->split(); // -> \Generator[34, 33, 33]
$r->getRemainder(); // 0

//

$r = Residue::create(101)
            ->divideBy(3)
            ->decimal(0);

$r->split(); // -> \Generator[34, 34, 33]
$r->getRemainder(); // 0

SPLIT_MODE_EQUITY 模式尝试根据步长平均分配最大值。

$r = Residue::create(100)
            ->divideBy(3)
            ->decimal(0);

$r->split(Residue::SPLIT_MODE_EQUITY); // -> \Generator[33, 33, 33]
$r->getRemainder(); // 1

//

$r = Residue::create(101)
            ->divideBy(3)
            ->decimal(0);

$r->split(Residue::SPLIT_MODE_EQUITY); // -> \Generator[33, 33, 33]
$r->getRemainder(); // 2

生成器

此包使用 生成器 以减少内存使用。

使用 foreach 语句(使用生成器)

$r = Residue::create(100)->divideBy(3);
foreach ($r->split() as $part) {
    var_dump($part);
}

float(33.34)
float(33.33)
float(33.33)

转换为数组

$r = Residue::create(100)->divideBy(3);
var_dump($r->toArray());

array(3) {
  [0]=>
  float(33.34)
  [1]=>
  float(33.33)
  [2]=>
  float(33.33)
}

测试

composer test

贡献

请参阅CONTRIBUTING 以获取详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件romainnorberg@gmail.com 而不是使用问题跟踪器。

致谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件