filmtools / mround
将数字四舍五入到另一个数字的最接近的倍数(mround、向上取整、向下取整)
1.1.2
2019-04-19 18:46 UTC
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^5.7|^6.0|^7.0
- spatie/phpunit-watcher: ^1.8
This package is auto-updated.
Last update: 2024-09-20 06:21:09 UTC
README
PHP实现Excel的mround函数:返回一个四舍五入到另一个数字的最接近倍数的数字。
本包包含什么?
使用 mround 函数进行四舍五入到最接近的倍数或分数,对应于MROUND
使用 mfloor 函数向下取整到最接近的倍数或分数,对应于FLOOR
使用 mceil 函数向上取整到最接近的倍数或分数,对应于CEILING
所有这些都包含在可调用的 MRounder 类中;四舍五入的行为由可选构造函数参数定义。
请参阅桌面软件文档中的Excel、LibreOffice或OpenOffice,以及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 )
异常
当传递非数字时,MRounder 和 mround 都会抛出 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