filmtools/mround

将数字四舍五入到另一个数字的最接近的倍数(mround、向上取整、向下取整)

1.1.2 2019-04-19 18:46 UTC

This package is auto-updated.

Last update: 2024-09-20 06:21:09 UTC


README

PHP实现Excel的mround函数:返回一个四舍五入到另一个数字的最接近倍数的数字。

Build Status Scrutinizer Code Quality Code Coverage Build Status

本包包含什么?

使用 mround 函数进行四舍五入到最接近的倍数或分数,对应于MROUND

使用 mfloor 函数向下取整到最接近的倍数或分数,对应于FLOOR

使用 mceil 函数向上取整到最接近的倍数或分数,对应于CEILING

所有这些都包含在可调用的 MRounder 类中;四舍五入的行为由可选构造函数参数定义。

请参阅桌面软件文档中的ExcelLibreOfficeOpenOffice,以及Nasser Hekmati在StackOverflow上的原始PHP实现。

安装

$ composer require filmtools/mround

函数

函数都是命名空间化的,所以你需要在你的 use 语句中提到它

use function FilmTools\MRounder\mround;
use function FilmTools\MRounder\mfloor;
use function FilmTools\MRounder\mceil;

所有函数都把 num 四舍五入到 base 的最接近倍数;它们的签名是

fn( float $num, float $base);

mround · “正常”四舍五入

<?php
use function FilmTools\MRounder\mround;

echo mround(   12,  10); // 10
echo mround(  2.4, 0.5); // 2.5
echo mround( 11.2, 1/3); // 11.333333333333
echo mround( 11.1, 1/3); // 11

mfloor · 向下取整

<?php
use function FilmTools\MRounder\mfloor;

echo mfloor(   59, 10);   // 50
echo mfloor(  2.4, 0.5);  // 2.0

mceil · 向上取整

<?php
use function FilmTools\MRounder\mceil;

echo mceil(   51, 10);   // 60
echo mceil(  2.4, 0.5);  // 2.5

MRounder · 可调用类

<?php
use FilmTools\MRounder\MRounder;

// Instantiate with the desired base multiple
$mrounder = new MRounder( 0.5 );
$mrounder = new MRounder( 0.5, MRounder::ROUND );
$mrounder = new MRounder( 0.5, "round" );
echo $mrounder( 2.4 ); // 2.5

// Down-rounder
$round_down = new MRounder( 0.5, MRounder::FLOOR );
$round_down = new MRounder( 0.5, "floor" );
echo $round_down( 2.4 ); // 2.0

// Up-rounder
$round_up = new MRounder( 0.5, MRounder::CEIL );
$round_up = new MRounder( 0.5, "ceil" );
echo $round_up( 7.2 ); // 7.5

// Bonus – You will find this interesting:
echo mround( 99, 0);  // 0    

数组欢迎!

// Build an array with equal keys and values:
$steps = range(0, 1, 0.1);
$numbers = array_combine($steps, $steps);

// Now let's round to multiples
// of one-sixth fraction:
$mround = new MRounder( 1/6 );
$sixths = array_map($mround, $numbers);
print_r($sixths);

// Output:
Array
(
    [0] => 0
    [0.1] => 0.16666666666667
    [0.2] => 0.16666666666667
    [0.3] => 0.33333333333333
    [0.4] => 0.33333333333333
    [0.5] => 0.5 # funny, but of course equals 2/6.
    [0.6] => 0.66666666666667
    [0.7] => 0.66666666666667
    [0.8] => 0.83333333333333
    [0.9] => 0.83333333333333
    [1] => 1
)

异常

当传递非数字时,MRoundermround 都会抛出 MRoundInvalidArgumentException,它扩展了PHP的 \InvalidArgumentException 并实现了 MRoundExceptionInterface。

<?php
use FilmTools\MRounder\MRounder;
use FilmTools\MRounder\MRoundInvalidArgumentException;
use FilmTools\MRounder\MRoundExceptionInterface;

try {
  	$mround = new MRounder( "foobar" );  
    // accordingly
    echo mround( 22, "string");
    echo mround( "foo", 4);        
}
catch (MRoundExceptionInterface $e) {
    echo get_class( $e );
	  echo $e->getMessage();
    // MRoundInvalidArgumentException
    // Parameter must be numeric.
}

开发和单元测试

$ git clone https://github.com/filmtools/mround.git
$ cd mround
$ composer install

# either, or, and:
$ composer phpunit
$ vendor/bin/phpunit