PHP Conference Japan 2024

bcmod

(PHP 4, PHP 5, PHP 7, PHP 8)

bcmod获取任意精度数字的模数

描述

bcmod(字符串 $num1, 字符串 $num2, ?整数 $scale = null): 字符串

获取 num1 除以 num2 的余数。结果与 num1 具有相同的符号。

参数

num1

左操作数,作为字符串。

num2

右操作数,作为字符串。

scale
此参数用于设置结果中小数点后的位数。如果为 null,则默认为使用 bcscale() 设置的默认 scale,或回退到 bcmath.scale INI 指令的值。

返回值

返回模数作为字符串。

错误/异常

此函数在以下情况下抛出 ValueError 异常

  • num1num2 不是格式良好的 BCMath 数字字符串。
  • scale 超出了有效范围。

如果 num20,则此函数抛出 DivisionByZeroError 异常。

变更日志

版本 描述
8.0.0 scale 现在可以为 null。
8.0.0 除以 0 现在抛出 DivisionByZeroError 异常,而不是返回 null。
7.2.0 num1num2 不再截断为整数,因此现在 bcmod() 的行为遵循 fmod() 而不是 % 运算符。
7.2.0 添加了 scale 参数。

示例

示例 #1 bcmod() 示例

<?php
bcscale
(0);
echo
bcmod( '5', '3'); // 2
echo bcmod( '5', '-3'); // 2
echo bcmod('-5', '3'); // -2
echo bcmod('-5', '-3'); // -2
?>

示例 #2 带小数的 bcmod()

<?php
bcscale
(1);
echo
bcmod('5.7', '1.3'); // 从 PHP 7.2.0 开始为 0.5;之前为 0
?>

参见

  • bcdiv() - 除以两个任意精度数字
  • bcdivmod() - 获取任意精度数字的商和模数

添加注释

用户贡献的注释 2 条注释

lauris at night dot lt
20 年前
<?php
/**
* my_bcmod - 获取模数(bcmod 的替代品)
* 字符串 my_bcmod ( 字符串左操作数, 整数模数 )
* 左操作数可以非常大,但要小心模数 :(
* 作者:Andrius Baranauskas 和 Laurynas Butkus :) 立陶宛维尔纽斯
**/
function my_bcmod( $x, $y )
{
// 每次获取多少个数字?小心不要超过 (int)
$take = 5;
$mod = '';

do
{
$a = (int)$mod.substr( $x, 0, $take );
$x = substr( $x, $take );
$mod = $a % $y;
}
while (
strlen($x) );

return (int)
$mod;
}

// 示例
echo my_bcmod( "7044060001970316212900", 150 );
?>
drahoszdenek at gmail dot com
11 年前
模数只能是整数。“浮点数”的 bcmod 返回 0

<?php
echo bcmod('10', '2.1'); // 0
?>

对于真正的模数,您可以使用 BN-PHP 项目(托管在 Bitbucket 上)

<?php
$eval
= new \BN\Expression\ExpressionEvaluator();
$operators = new \BN\Expression\OperatorsFactory();
$eval->setOperators($operators->getOperators(array('%')));

echo
$eval->evaluate('10 % 2.1'); // 1.6
echo $eval->evaluate('10 % -2.1'); // 1.6
echo $eval->evaluate('-10 % 2.1'); // -1.6
echo $eval->evaluate('-10 % -2.1'); // -1.6
?>
To Top