Fmod: примеры (PHP)

Функция fmod в PHP: вычисление остатка от деления с плавающей точкой
Раздел: Математические функции
fmod(float $num1, float $num2): float
Основные сведения о функции fmod

Функция 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.5
Особый случай: делитель равен нулю
var_dump(fmod(5.7, 0.0));
bool(false)
// В PHP 8.0+ возвращается false и генерируется предупреждение
Альтернативные функции в PHP
  • Оператор %: Работает только с целыми числами (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.5

Fmod в Javascript

Оператор % работает и с числами с плавающей точкой, что делает его аналогом fmod.

console.log(5.7 % 1.3);
0.5

Fmod в 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
Деление на ноль (PHP 8.0+)

Вместо возврата 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).

Пример php
$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 градусов.

Пример php
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
Работа с большими числами

Сравнение с целочисленным оператором %.

Пример php
$large = 1e19 + 1;
echo 'fmod: ' . fmod($large, 2) . '\n';
echo 'operator %: ' . ($large % 2);
fmod: 0
operator %: 0 // Для таких величин int может переполниться
Вычисление дробной части числа
Пример php
function fractionalPart($num) {
return fmod($num, 1);
}
echo fractionalPart(12.345) . '\n';
echo fractionalPart(-7.89);
0.345
-0.89 // Знак сохраняется
Генерация циклических значений

Создание повторяющейся последовательности.

Пример php
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

PHP fmod function comments

En
Fmod Returns the floating point remainder (modulo) of the division of the arguments