Doubleval: примеры (PHP)
doubleval(mixed $value): floatФункция doubleval() в PHP возвращает вещественное (с плавающей точкой) значение переменной. Это псевдоним функции floatval(). Используется для приведения строковых, целочисленных и других типов данных к числу с плавающей точкой.
Применение функции актуально при обработке пользовательского ввода, чтении данных из файлов или баз данных, когда требуется гарантированно получить число с плавающей точкой для математических операций.
Функция принимает один обязательный аргумент:
- $value – переменная, которую необходимо преобразовать в вещественное число.
Функция не поддерживает дополнительные флаги или параметры.
echo doubleval('123.45');
echo doubleval(' -12.34e3');
echo doubleval('123abc');
123.45 -12340 123
echo doubleval(15);
echo doubleval(true);
echo doubleval(false);
echo doubleval(null);
15 1 0 0
echo doubleval([1, 2]);
1
- floatval() — абсолютный аналог doubleval(), возвращает вещественное значение переменной.
- intval() — возвращает целочисленное значение переменной. Полезно, когда требуется целое число.
- strval() — возвращает строковое представление переменной.
- settype() — изменяет тип переменной на указанный. Модифицирует исходную переменную.
- (float) или (double) — приведение типов. Оператор приведения работает быстрее, чем вызов функции.
Предпочтения:
Doubleval в Python
print(float('123.45'))
print(float(' -12.34e3 '))
print(float('123abc')) # ValueError
123.45 -12340 # Исключение ValueError
В Python функция float() строже — вызывает исключение при невозможности преобразования.
Doubleval в Javascript
console.log(parseFloat('123.45'));
console.log(parseFloat(' -12.34e3'));
console.log(parseFloat('123abc'));
console.log(Number('123.45'));
123.45 -12340 123 123.45
JavaScript использует parseFloat() для строк и Number() для явного приведения. Поведение похоже на PHP, но есть нюансы с NaN.
Doubleval в MySQL
SELECT CAST('123.45' AS DECIMAL(10,2));
SELECT '123.45' + 0.0;
123.45 123.45
В MySQL используют CAST() или неявное приведение через арифметические операции. Тип DECIMAL часто применяется для точных вычислений.
echo doubleval([1, 2, 3]);
echo doubleval(new stdClass());
1 1
Для массивов возвращается 1, для объектов — 1 (если класс не имеет __toString()). Это может привести к неожиданным результатам.
$bigInt = '9999999999999999';
echo $bigInt . ' -> ' . doubleval($bigInt);
9999999999999999 -> 1.0E+16
Числа, превышающие PHP_FLOAT_MAX, теряют точность из-за ограничений формата IEEE 754.
setlocale(LC_NUMERIC, 'ru_RU.UTF-8');
echo doubleval('123,45');
123
Функция не учитывает локаль. Запятая как разделитель дробной части обрабатывается как конец числа.
В PHP 8.0 поведение функции doubleval() осталось неизменным по сравнению с предыдущими версиями. Основные изменения касаются внутренней реализации приведения типов, но интерфейс функции сохранен.
В PHP 8.1 и 8.2 не было внесено значительных изменений в работу этой функции. Однако, начиная с PHP 8.0, многие функции стали строже к типам, но doubleval() по-прежнему принимает значение любого типа и пытается его преобразовать.
$prices = ['10.5', 'not a price', '20.75', '', null, '15'];
$sum = array_sum(array_map('doubleval', $prices));
echo $sum;
46.25
Функция применяется к каждому элементу массива, преобразуя допустимые значения в числа, а остальные — в 0.
$input = '12.345';
$epsilon = 0.00001;
$result = doubleval($input);
if (abs($result - 12.345) < $epsilon) {
echo 'Числа считаются равными';
}
Числа считаются равными
Из-за особенностей чисел с плавающей точкой прямое сравнение не рекомендуется.
function array_to_double($item) {
return is_array($item) ? array_map('array_to_double', $item) : doubleval($item);
}
$data = [['1.1', '2.2'], ['3.3', 'abc']];
print_r(array_to_double($data));
Array
(
[0] => Array
(
[0] => 1.1
[1] => 2.2
)
[1] => Array
(
[0] => 3.3
[1] => 0
)
)
Пример показывает рекурсивное применение doubleval() ко всем элементам массива.
echo doubleval('1.23e-4');
echo doubleval('-5.6E+10');
0.000123 -56000000000
Функция корректно обрабатывает экспоненциальную запись чисел.
echo doubleval('0x1A'); // Преобразуется как 0
echo doubleval('1.2e3'); // А это научная нотация
0 1200
Шестнадцатеричные строки интерпретируются как 0, в отличие от intval(), которая может их преобразовывать.