In PHP, the fmod() function is used to compute the remainder after dividing two floating-point numbers. Unlike the % modulus operator, fmod() works with floating-point numbers and preserves the sign of the dividend. This leads to specific behavior and application scenarios when dealing with negative remainders. This article explores the practical uses and important considerations when using the fmod() function with negative values.
fmod(float $num1, float $num2): float
fmod() calculates the remainder of $num1 divided by $num2, with the result retaining the same sign as $num1.
<?php
echo fmod(5.7, 2.3); // Outputs 1.1
echo fmod(-5.7, 2.3); // Outputs -1.1
?>
As shown, when the dividend is negative, the remainder also carries a negative sign.
Time Calculations and Periodic Handling
In time-related and periodic event handling, it is common to apply modulo operations to timestamps or counters. When time or counts may be negative (such as countdowns or time differences), using fmod() correctly handles negative remainders and maintains logical time flow.
<?php
$time = -7.5; // Represents countdown seconds
$period = 3.0; // Period is 3 seconds
$remainder = fmod($time, $period); // Result is -1.5
?>
Coordinate Calculations and Looping Animations
In graphics or animations, position calculations may involve floating-point modulo operations. Negative remainders can be useful for calculating reverse loops or wrap-around effects.
Negative Remainders in Financial Calculations
Some financial computations involve interest adjustments or recurring charges, where negative remainders precisely reflect values in negative scenarios.
The Remainder Sign Matches the Dividend
The fmod() return value retains the sign of the dividend $num1, which differs from the % operator behavior in PHP.
<?php
echo fmod(-5, 3); // Outputs -2
echo (-5 % 3); // Outputs -2, same result but different types; fmod returns a float
?>
Difference from Integer Modulo Operations
fmod() calculates remainders with floating-point precision, which can result in decimals, unlike %, which only supports integers. Floating-point inaccuracies may lead to precision issues.
The Divisor Cannot Be Zero
The divisor $num2 must not be zero; otherwise, a warning is raised and NAN is returned.
Handling Negative Divisors
When the divisor is negative, the sign of the remainder still follows the dividend, not the divisor.
<?php
echo fmod(5, -3); // Outputs 2
echo fmod(-5, -3); // Outputs -2
?>
The following example demonstrates negative remainder calculation and practical usage:
<?php
// Calculate periodic remainder for negative time
function cycleTime(float $time, float $period): float {
$mod = fmod($time, $period);
// Normalize the remainder to be positive (between 0 and $period)
if ($mod < 0) {
$mod += $period;
}
return $mod;
}
<p>$times = [-7.5, -3.1, 0, 2.5, 7.8];<br>
$period = 3.0;</p>
<p>foreach ($times as $t) {<br>
echo "Time: $t, Cycle Remainder: " . cycleTime($t, $period) . "\n";<br>
}<br>
?><br>
Output:
Time: -7.5, Cycle Remainder: 1.5
Time: -3.1, Cycle Remainder: 2.9
Time: 0, Cycle Remainder: 0
Time: 2.5, Cycle Remainder: 2.5
Time: 7.8, Cycle Remainder: 1.8
This approach allows you to convert negative remainders into positive values, which is useful for periodic processing.
For more information on PHP functions, you can refer to the official PHP documentation: