PHP 8.4.2 Released!

bcmod

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

bcmodModulo zweier Zahlen mit beliebiger Genauigkeit

Beschreibung

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

Liefert den Rest der Division von num1 durch num2. Das Ergnis hat dasselbe Vorzeichen wie num1.

Parameter-Liste

num1

Der linke Operand als Zeichenkette.

num2

Der rechte Operand als Zeichenkette.

scale
Dieser Parameter wird verwendet, um die Anzahl der Nachkommastellen im Ergebnis festzulegen. Falls null, wird die mit bcscale() definierte Standard-Genauigkeit verwendet oder auf den Wert der INI-Direktive bcmath.scale zurückgegriffen.

Rückgabewerte

Gibt den Modulo als Zeichenkette zurück.

Fehler/Exceptions

Diese Funktion löst in den folgenden Fällen einen ValueError aus:

  • num1 oder num2 ist keine wohlgeformte numerische BCMath-Zeichenkette.
  • scale liegt außerhalb des gültigen Bereichs.

Wenn num2 0 ist, löst diese Funktion eine DivisionByZeroError-Exception aus.

Changelog

Version Beschreibung
8.0.0 scale ist jetzt nullbar.
8.0.0 Die Division durch 0 löst nun eine DivisionByZeroError-Exception aus, anstatt null zurückzugeben.
7.2.0 num1 und num2 werden nicht länger zu einer Ganzzahl abgeschnitten, so dass nun das Verhalten von bcmod() eher fmod() statt dem % Operator entspricht.
7.2.0 Der Parameter scale wurde hinzugefügt.

Beispiele

Beispiel #1 bcmod()-Beispiel

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

Beispiel #2 bcmod() mit Dezimalzahlen

<?php
bcscale
(1);
echo
bcmod('5.7', '1.3'); // 0.5 von PHP 7.2.0 an; 0 zuvor
?>

Siehe auch

  • bcdiv() - Division zweier Zahlen beliebiger Genauigkeit
  • bcdivmod() - Get the quotient and modulus of an arbitrary precision number

add a note

User Contributed Notes 2 notes

up
4
lauris at night dot lt
20 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
11 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