Базовый курс PHP — Переменные с дробным типом (float)
Уроки курса 9 из 12
Содержание урока
Что значит переменные с типом данных float?
Переменные с типом данных float предназначены для хранения дробных (вещественных) чисел,
например: 3.14, -0.5, 99.99, 0.001
Такой тип данных может содержать числа с десятичной точкой (положительные, отрицательные и ноль).
Дробные числа обозначаются типом данных float (также называется double).
Дробные числа записываются без кавычек, а в качестве разделителя целой и дробной части используется точка .
Рассмотрим пример с выводом дробных чисел на экран.
<?php
// Присвоим переменным дробные значения
$price = 19.99;
$temperature = -3.5;
$pi = 3.14159;
$zero = 0.0;
// Выведем значения переменных на экран
echo $price . PHP_EOL;
echo $temperature . PHP_EOL;
echo $pi . PHP_EOL;
echo $zero;
19.99
-3.5
3.14159
0
Как выполнять математические операции с float?
С дробными числами можно выполнять те же математические операции, что и с целыми:
+ — сложение
- — вычитание
* — умножение
/ — деление
<?php
echo 10.5 + 3.2; // Сложение
echo PHP_EOL;
echo 10.5 - 3.2; // Вычитание
echo PHP_EOL;
echo 2.5 * 4.0; // Умножение
echo PHP_EOL;
echo 10.0 / 3.0; // Деление
13.7
7.3
10
3.3333333333333
Обратите внимание: если у дробного числа нет дробной части, echo выводит его без .0.
Результат 2.5 * 4.0 выведен как 10, а 0.0 из первого примера — как 0.
Тип значения при этом остаётся float.
Результат математических операций с дробными числами можно присваивать переменным и выводить на экран.
<?php
$width = 5.5;
$height = 3.2;
$area = $width * $height;
echo 'Ширина: ' . $width . PHP_EOL;
echo 'Высота: ' . $height . PHP_EOL;
echo 'Площадь: ' . $area;
Ширина: 5.5
Высота: 3.2
Площадь: 17.6
Когда деление целых чисел возвращает float?
При делении двух целых чисел, если результат не является целым числом, PHP автоматически вернет float.
Для определения типа значения можно использовать функцию gettype().
<?php
$a = 10;
$b = 3;
$result = $a / $b;
echo $result . PHP_EOL; // 3.3333333333333
echo gettype($result) . PHP_EOL; // double (это и есть float)
echo gettype($a); // integer
3.3333333333333
double
integer
Как округлять дробные числа?
PHP предоставляет несколько функций для округления дробных чисел:
round() — округление по математическим правилам
ceil() — округление вверх
floor() — округление вниз
<?php
$number = 7.7;
echo round($number) . PHP_EOL; // 8 - округление по правилам математики
echo ceil($number) . PHP_EOL; // 8 - округление вверх
echo floor($number) . PHP_EOL; // 7 - округление вниз
$number2 = 4.3;
echo round($number2) . PHP_EOL; // 4
echo ceil($number2) . PHP_EOL; // 5
echo floor($number2); // 4
8
8
7
4
5
4
Функция round() может принимать второй параметр — количество знаков после запятой.
<?php
$number = 3.14159;
echo round($number, 2) . PHP_EOL; // 3.14
echo round($number, 3) . PHP_EOL; // 3.142
echo round($number, 4); // 3.1416
3.14
3.142
3.1416
Как объединить float и строки?
Дробные числа, как и целые, можно объединять со строками с помощью оператора точка . (конкатенация)
или вставлять в двойные кавычки.
<?php
$price = 49.99;
$quantity = 3;
// Конкатенация с float
echo 'Цена: ' . $price . ' руб.' . PHP_EOL;
// Вставка переменной в двойные кавычки
echo "Итого: {$price} руб. за штуку" . PHP_EOL;
$total = $price * $quantity;
echo "Общая сумма: {$total} руб.";
Цена: 49.99 руб.
Итого: 49.99 руб. за штуку
Общая сумма: 149.97 руб.
Особенности точности float
Дробные числа хранятся в компьютере в двоичном формате, поэтому некоторые десятичные дроби не могут быть представлены точно. Это может привести к неожиданным результатам.
echo округляет дробное число при выводе, поэтому неточность с его помощью не видна.
Точное значение показывает функция var_dump() — она выводит тип и значение.
Оператор == сравнивает два значения: true — равны, false — нет.
Подробнее о сравнении — в уроке про тип bool.
<?php
// Сумма 0.1 и 0.2 хранится неточно
var_dump(0.1 + 0.2); // float(0.30000000000000004)
var_dump(0.1 + 0.2 == 0.3); // bool(false)
// Решение: округлить результат с помощью round()
$result = round(0.1 + 0.2, 1);
var_dump($result); // float(0.3)
var_dump($result == 0.3); // bool(true)
float(0.30000000000000004)
bool(false)
float(0.3)
bool(true)
round() для округления результатов.