До двух знаков после запятой в PHP: топ-методы 2025

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему «просто round()» больше не работает? Взгляд в 2025

Каждый, кто хоть раз писал интернет-магазин, бухгалтерский модуль или парсер курсов валют на PHP, сталкивался с вопросом: «Как красиво вывести число 19.9999999999999 как 20.00?» На Stack Overflow этот вопрос собрал тысячи просмотров, и неспроста. В 2025 году, когда PHP гордо носит версию 8.4 и выше, старые добрые трюки с round() иногда подкидывают сюрпризы, достойные фильма ужасов.

Давайте разберемся раз и навсегда: как показать число с двумя знаками после запятой в PHP, чтобы это было надежно, красиво и соответствовало современным стандартам. Мы не просто скопируем ответ с форума — мы поймем, почему каждый способ работает именно так.

Проблема №1: Плавающая точка — ваш коварный друг

PHP, как и большинство языков, использует формат IEEE 754 для чисел с плавающей точкой (float). Это значит, что число 0.1 + 0.2 может быть равно не 0.3, а 0.30000000000000004. А 19.95, умноженное на 100, может дать 1994.9999999999998. Если вы просто вызовете round() — получите неожиданный результат.

Поэтому в 2025 году правило номер один: не доверяйте float для финансов. Но если вам нужно просто отформатировать вывод (например, цену на витрине), то следующие методы — то, что доктор прописал.

Метод №1: Классика — number_format()

Это самый популярный и безопасный способ для 99% задач. Функция number_format() не просто округляет — она форматирует число с разделителями тысяч и заданным количеством десятичных знаков.

<?php
$price = 19.999999;
echo number_format($price, 2, '.', ''); // Выведет: 20.00

$salary = 1234.5;
echo number_format($salary, 2, '.', ','); // Выведет: 1,234.50
?>

Почему это круто:

  • Автоматически округляет до указанного количества знаков (по математическим правилам).
  • Позволяет задать свой разделитель целой и дробной части.
  • Добавляет нули, если дробная часть короче (например, 5.00 вместо 5).

Тонкий момент: Если передать строку, PHP попытается преобразовать её в число. Будьте аккуратны с локалями — запятая в строке может быть воспринята не как десятичный разделитель.

Когда использовать?

Для вывода цен, зарплат, процентов и любых данных, где нужны два знака после запятой и разделение разрядов.

Метод №2: Математическая точность — round()

Функция round() возвращает число (тип float), а не строку. Это важно, если вы собираетесь делать дальнейшие вычисления.

<?php
$value = 45.6789;
$rounded = round($value, 2); // 45.68 (float)

// Но! Если нужно именно два знака и ноль в конце:
echo $rounded; // Выведет 45.68 (всё ок)
echo round(45.0, 2); // Выведет 45 (float), а не 45.00
?>

Подводный камень: round() использует "банковское округление" (round half to even) по умолчанию в PHP 8+. Это значит, что 2.5 округлится до 2, а 3.5 — до 4. Для финансов это может быть неприемлемо. Используйте константу PHP_ROUND_HALF_UP для классического округления:

<?php
echo round(2.5, 0, PHP_ROUND_HALF_UP); // 3
echo round(2.5, 0); // 2 (банковское)
?>

Вывод: round() + number_format()

Идеальный тандем: сначала округляем для вычислений, потом форматируем для вывода.

<?php
$raw = 19.999999;
$precise = round($raw, 2, PHP_ROUND_HALF_UP);
echo number_format($precise, 2, '.', ''); // 20.00
?>

Метод №3: Элегантность sprintf()

Функция sprintf() — мощный инструмент форматирования строк. Она не округляет, а отбрасывает лишние знаки? Нет, она тоже округляет, но делает это по принципу "пол-вверх".

<?php
echo sprintf("%.2f", 5.678); // 5.68
echo sprintf("%.2f", 5.001); // 5.00
echo sprintf("%.2f", 5);     // 5.00
?>

Плюс: Очень кратко. Минус: Результат — строка. Нельзя использовать в арифметике без преобразования обратно. Также, как и number_format, sprintf зависит от локали, если не указать явно (sprintf("%.2f", $num) — безопасно, так как точка жестко задана).

Когда выбирать sprintf?

Когда нужно встроить число в строку: "Сумма: %.2f руб." — идеально.

Метод №4: Строгий режим и типизация (PHP 8+)

В 2025 году модно быть строгим. Используйте declare(strict_types=1); и функции с явным приведением типов. Это не даст вам случайно передать строку "19,99" и получить сюрприз.

<?php
declare(strict_types=1);

function formatPrice(float $price): string {
    return number_format($price, 2, '.', '');
}

echo formatPrice(19.999); // 20.00
echo formatPrice("19,99"); // Fatal error: Uncaught TypeError
?>

Это дисциплинирует код и делает его предсказуемым.

Метод №5: Для профи — расширение Decimal

Если вы работаете с финансами, криптовалютами или научными расчетами, где точность критична, стандартный float — зло. В PHP 8.4 появилось расширение Decimal (или используйте библиотеку php-decimal). Оно оперирует числами с фиксированной точкой и не имеет проблем с IEEE 754.

<?php
// Пример с библиотекой Decimal (установка: composer require php-decimal/php-decimal)
use Decimal\Decimal;

$price = new Decimal('19.999');
echo $price->round(2); // 20.00 (Decimal object)
echo $price->round(2)->format(2, '.'); // "20.00"
?>

Плюс: Абсолютная

Блоги

Рекомендаций по книгам