(PHP 4, PHP 5, PHP 7, PHP 8)
bcmod — Devuelve el resto de una división entre números de gran tamaño
Devuelve el resto de la división entre num1
utilizando num2.
El resultado tiene el mismo signo que num1.
num1El operador izquierdo, como una cadena.
num2El operador derecho, como una cadena
scalenull , se establecerá por defecto en la escala predeterminada establecida con bcscale() ,
o se utilizará el valor de la directiva INI
bcmath.scale.
Devuelve el módulo, en forma de string .
Esta función lanza una excepción ValueError en los siguientes casos:
num1 o num2
no es una cadena numérica bien formada de BCMath.
scale está fuera del rango válido.
Esta función lanza una excepción DivisionByZeroError
si num2 es 0.
| Versión | Descripción |
|---|---|
| 8.0.0 |
scale ahora es nullable.
|
| 8.0.0 |
La división por 0 ahora lanza una excepción
DivisionByZeroError en lugar de devolver null.
|
| 7.2.0 |
num1 y num2 ya no se truncan a enteros. El comportamiento de bcmod()
sigue a fmod() en lugar del operador %.
|
| 7.2.0 |
Se ha añadido el parámetro scale.
|
Ejemplo #1 Ejemplo con bcmod()
<?php
bcscale(0);
echo bcmod( '5', '3'); // 2
echo bcmod( '5', '-3'); // 2
echo bcmod('-5', '3'); // -2
echo bcmod('-5', '-3'); // -2
?>Ejemplo #2 bcmod() con decimales
<?php
bcscale(1);
echo bcmod('5.7', '1.3'); // 0.5 desde PHP 7.2.0; 0 anteriormente
?>
<?php
/**
* my_bcmod - get modulus (substitute for bcmod)
* string my_bcmod ( string left_operand, int modulus )
* left_operand can be really big, but be carefull with modulus :(
* by Andrius Baranauskas and Laurynas Butkus :) Vilnius, Lithuania
**/
function my_bcmod( $x, $y )
{
// how many numbers to take at once? carefull not to exceed (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;
}
// example
echo my_bcmod( "7044060001970316212900", 150 );
?>The modulus can be only integer. For "floats" bcmod returns 0:
<?php
echo bcmod('10', '2.1'); // 0
?>
For real modulus you can use BN-PHP project (hosted at 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
?>