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

Использование doubleval для преобразования типов в PHP
Раздел: Преобразование типов/форматов
doubleval(mixed $value): float
Описание функции doubleval

Функция 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
Похожие функции в PHP
  • floatval() — абсолютный аналог doubleval(), возвращает вещественное значение переменной.
  • intval() — возвращает целочисленное значение переменной. Полезно, когда требуется целое число.
  • strval() — возвращает строковое представление переменной.
  • settype() — изменяет тип переменной на указанный. Модифицирует исходную переменную.
  • (float) или (double) — приведение типов. Оператор приведения работает быстрее, чем вызов функции.

Предпочтения:

  • Использовать (float) для быстрого и явного приведения в коде.
  • Применять doubleval() или floatval() в контексте функций обратного вызова или когда имя функции передается как строка.
  • Функция intval() подходит для получения целой части числа.
Аналоги в других языках

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

В PHP 8.0 поведение функции doubleval() осталось неизменным по сравнению с предыдущими версиями. Основные изменения касаются внутренней реализации приведения типов, но интерфейс функции сохранен.

В PHP 8.1 и 8.2 не было внесено значительных изменений в работу этой функции. Однако, начиная с PHP 8.0, многие функции стали строже к типам, но doubleval() по-прежнему принимает значение любого типа и пытается его преобразовать.

Расширенные примеры
Фильтрация и суммирование массива
Пример php
$prices = ['10.5', 'not a price', '20.75', '', null, '15'];
$sum = array_sum(array_map('doubleval', $prices));
echo $sum;
46.25

Функция применяется к каждому элементу массива, преобразуя допустимые значения в числа, а остальные — в 0.

Сравнение чисел после преобразования
Пример php
$input = '12.345';
$epsilon = 0.00001;
$result = doubleval($input);
if (abs($result - 12.345) < $epsilon) {
    echo 'Числа считаются равными';
}
Числа считаются равными

Из-за особенностей чисел с плавающей точкой прямое сравнение не рекомендуется.

Рекурсивное преобразование в многомерном массиве
Пример php
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() ко всем элементам массива.

Обработка научной нотации
Пример php
echo doubleval('1.23e-4');
echo doubleval('-5.6E+10');
0.000123
-56000000000

Функция корректно обрабатывает экспоненциальную запись чисел.

Работа с шестнадцатеричными строками
Пример php
echo doubleval('0x1A');  // Преобразуется как 0
echo doubleval('1.2e3'); // А это научная нотация
0
1200

Шестнадцатеричные строки интерпретируются как 0, в отличие от intval(), которая может их преобразовывать.

PHP doubleval function comments

En
Doubleval Alias of floatval