Fmod: примеры (PHP)
fmod(float $num1, float $num2): floatФункция fmod в PHP возвращает остаток от деления (по модулю) двух чисел с плавающей точкой (float).
Использование функции актуально в случаях, когда требуется определить остаток от деления чисел, которые не являются целыми. Стандартный оператор % работает только с целыми числами (int), поэтому для операций с float применяется fmod.
Синтаксис функции: fmod(float $num1, float $num2): float.
- $num1 (делимое) — число с плавающей точкой, которое будет делиться.
- $num2 (делитель) — число с плавающей точкой, на которое производится деление.
Функция возвращает остаток от деления $num1 на $num2. Возвращаемое значение — число с плавающей точкой. Знак результата всегда совпадает со знаком делимого ($num1).
echo fmod(5.7, 1.3);0.5Знак результата соответствует знаку делимого.
echo fmod(-5.7, 1.3) . '\n';
echo fmod(5.7, -1.3);-0.5
0.5var_dump(fmod(5.7, 0.0));bool(false)
// В PHP 8.0+ возвращается false и генерируется предупреждение- Оператор %: Работает только с целыми числами (int). Перед вычислением операнды преобразуются в целые числа (отбрасывается дробная часть).
echo 5.7 % 1.3; // 5 % 1
Используется для целочисленного деления.0 - intdiv(): Возвращает целочисленный результат деления, отбрасывая остаток. Принимает только целые числа.
- bcmod(): Функция модуля из математической библиотеки BC Math для чисел произвольной точности, представленных строками. Работает с целыми числами, представленными как string.
fmod предпочтительнее использовать именно для точного вычисления остатка от деления чисел с плавающей точкой.
Fmod в Python
Оператор % и функция math.fmod(). Поведение с отрицательными числами может отличаться.
import math
print(math.fmod(5.7, 1.3))
print(5.7 % 1.3)0.5
0.5Fmod в Javascript
Оператор % работает и с числами с плавающей точкой, что делает его аналогом fmod.
console.log(5.7 % 1.3);0.5Fmod в MySQL
Функция MOD(x, y) или оператор %. Работает с целыми и дробными числами.
SELECT MOD(5.7, 1.3);0.5Отличие PHP-функции fmod часто заключается в деталях обработки граничных случаев (например, деление на ноль) и точности вычислений с плавающей точкой.
Из-за природы чисел с плавающей точкой результат может быть не совсем точным. Прямое сравнение может привести к ошибке.
$result = fmod(10, 3); // Ожидается 1, но...
var_dump($result == 1);bool(false)
// Лучше использовать сравнение с допустимой погрешностью: abs($result - 1) < 0.00001Функция всегда возвращает float, даже если остаток целый.
$result = fmod(10, 5);
echo gettype($result);doubleВместо возврата INF или NAN функция возвращает false и выдаёт предупреждение.
var_dump(@fmod(5.7, 0));bool(false)- PHP 8.0.0: Изменено поведение при делении на ноль. Ранее функция
fmod()возвращалаINFилиNANв зависимости от знака делимого. Начиная с PHP 8.0, функция возвращаетfalseи генерирует сообщение уровняE_WARNING.
Определение, кратно ли одно число другому (для float).
$step = 0.25;
$value = 1.5;
$remainder = fmod($value, $step);
$isMultiple = abs($remainder) < 0.00001;
var_dump($isMultiple);bool(true) // 1.5 кратно 0.25Приведение угла к диапазону от 0 до 360 градусов.
function normalizeAngle($angle) {
$result = fmod($angle, 360.0);
if ($result < 0) {
$result += 360.0;
}
return $result;
}
echo normalizeAngle(450.5) . '\n';
echo normalizeAngle(-90.25);90.5
269.75Сравнение с целочисленным оператором %.
$large = 1e19 + 1;
echo 'fmod: ' . fmod($large, 2) . '\n';
echo 'operator %: ' . ($large % 2);fmod: 0
operator %: 0 // Для таких величин int может переполнитьсяfunction fractionalPart($num) {
return fmod($num, 1);
}
echo fractionalPart(12.345) . '\n';
echo fractionalPart(-7.89);0.345
-0.89 // Знак сохраняетсяСоздание повторяющейся последовательности.
for ($i = 0; $i < 10; $i += 0.7) {
echo round(fmod($i, 3), 2) . ' ';
}0 0.7 1.4 2.1 2.8 0.5 1.2 1.9 2.6 0.3