bcmod

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

bcmodDevuelve el resto de una división entre números de gran tamaño

Descripción

bcmod(string $num1, string $num2, ?int $scale = null): string

Devuelve el resto de la división entre num1 utilizando num2. El resultado tiene el mismo signo que num1.

Parámetros

num1

El operador izquierdo, como una cadena.

num2

El operador derecho, como una cadena

scale
Este parámetro se utiliza para establecer el número de dígitos después del punto decimal en el resultado. Si es null, se establecerá por defecto en la escala predeterminada establecida con bcscale(), o se utilizará el valor de la directiva INI bcmath.scale.

Valores devueltos

Devuelve el módulo, en forma de string.

Errores/Excepciones

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.

Historial de cambios

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.

Ejemplos

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
?>

Ver también

  • bcdiv() - Divide dos números de precisión arbitraria
  • bcdivmod() - Devuelve el cociente y el resto de un número de precisión arbitraria
  • BcMath\Number::mod() - Devuelve el módulo de un número de precisión arbitraria

add a note

User Contributed Notes 2 notes

up
5
lauris at night dot lt
21 years ago
<?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 );
?>
up
1
drahoszdenek at gmail dot com
12 years ago
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
?>
To Top