Как вывести число с двумя знаками после запятой в PHP?
Основное решение: функция number_format()
Для вывода числа с двумя знаками после запятой в PHP стандартным и наиболее гибким решением является функция number_format(). Она не только форматирует количество десятичных знаков, но и позволяет управлять разделителями целой и дробной части, а также разделителями тысяч.
В вашем случае, когда нужно просто "всегда два знака после запятой", используйте:
<?php
$price = 10;
$tax = 5.5;
$total = 15.5;
echo number_format($price, 2); // 10.00
echo number_format($tax, 2); // 5.50
echo number_format($total, 2); // 15.50
?>
Как работает number_format()
Функция принимает от 1 до 4 параметров:
- Первый (обязательный): число, которое нужно отформатировать.
- Второй: количество знаков после запятой. Если указать 2 — получите ровно 2 знака, даже если число целое.
- Третий: разделитель десятичной части (по умолчанию точка ".").
- Четвертый: разделитель тысяч (по умолчанию запятая ",").
Пример с русским форматом (пробел как разделитель тысяч, запятая как десятичный разделитель):
<?php
$bigNumber = 1234567.89;
echo number_format($bigNumber, 2, ',', ' '); // 1 234 567,89
?>
Округление vs отбрасывание
Важный момент: number_format() всегда округляет число по математическим правилам (0.5 округляется вверх). Это стандартное поведение для большинства финансовых расчётов.
Если вам нужно именно отбросить лишние знаки (floor/truncate), есть два подхода:
1. Использовать математическое отбрасывание:
<?php
$value = 10.005;
$truncated = floor($value * 100) / 100; // 10.00
echo number_format($truncated, 2); // 10.00
?>
2. Использовать sprintf с форматированием:
<?php
$value = 10.005;
echo sprintf("%.2f", $value); // 10.00 (но это тоже округление!)
// Для отбрасывания:
echo sprintf("%.2f", floor($value * 100) / 100); // 10.00
?>
Сравнение методов
- number_format() — лучший выбор для вывода. Даёт контроль над разделителями, работает с большими числами, округляет.
- sprintf("%.2f", $num) — удобен, если число нужно сразу в строку, но не добавляет разделители тысяч.
- round($num, 2) — только округляет, но не форматирует количество знаков (10.5 останется 10.5).
- floor() / ceil() — для специфических случаев, когда нужно принудительно отбросить или увеличить дробную часть.
Рекомендация для вашего кода
<?php
$price = 10;
$tax = 5.5;
$total = $price + $tax;
echo "Цена: " . number_format($price, 2); // 10.00
echo "Налог: " . number_format($tax, 2); // 5.50
echo "Итого: " . number_format($total, 2); // 15.50
?>
Этот код будет работать стабильно для любых чисел и даст вам ровно два знака после запятой с правильным округлением. Если вам нужно отображать числа в разных локалях (например, для русскоязычных пользователей — запятая вместо точки), просто добавьте параметры локализации.
<<Альтернативный подход: использование printf/sprintf
Если вам не нужны разделители тысяч и вы хотите более компактный синтаксис, можно использовать семейство функций printf() / sprintf(). Они работают быстрее number_format() на простых операциях, но не умеют добавлять разделители тысяч.
<?php
$price = 10;
$tax = 5.5;
// Прямой вывод
printf("Цена: %.2f", $price); // Цена: 10.00
printf("Налог: %.2f", $tax); // Налог: 5.50
// Сохранение в переменную
$formatted = sprintf("%.2f", $price + $tax); // "15.50"
?>
Когда это удобно?
- В шаблонах или при конкатенации строк, где нужно сразу получить отформатированное значение.
- В циклах, где производительность критична (sprintf чуть быстрее number_format).
- Когда нужно смешивать форматирование чисел и строк (например, "Ваш баланс: %.2f руб.").
Важное отличие
sprintf("%.2f", ...) использует точку как десятичный разделитель и не добавляет разделители тысяч. Если вам нужно изменить десятичный разделитель на запятую, придётся делать замену вручную:
<?php
$value = 1234.5;
echo str_replace('.', ',', sprintf("%.2f", $value)); // 1234,50
?>
Этот подход менее гибкий, чем number_format(), но для простых случаев (особенно если вы работаете с англоязычной аудиторией) он вполне подходит и часто используется в легаси-коде.
Ответов пока нет.
Войдите чтобы оставить ответ