воскресенье, 23 февраля 2020 г.

Строковые представления типов данных, часть 2

Продолжим рассматривать php преобразует различные типы данных к строковому виду. Первая часть здесь.

Рассмотрим тип данных int. Переменная типа int может быть задана в четырех системах счисления: десятичной, восьмеричной, шестнадцатеричной и двоичной. Независимо от системы счисления, вывод будет преобразован к десятичной системе счисления:

$a = 0;
$b = 42;
$c = 0b101011;   // 43 в десятичной
$d = 054;        // 44 в десятичной
$e = 0x2D;       // 45 в десятичной
$f = -42;

echo $a . PHP_EOL;
echo $b . PHP_EOL;
echo $c . PHP_EOL;
echo $d . PHP_EOL;
echo $e . PHP_EOL;
echo $f . PHP_EOL;
// вывод:
0
42
43
44
45
-42


Числа, превышающие размер типа int (PHP_INT_MAX / PHP_INT_MIN), автоматически конвертируются в тип float и выводятся соответствующе:

$a = PHP_INT_MAX;
$b = 2 + PHP_INT_MAX;
$c = PHP_INT_MIN;
$d = PHP_INT_MIN -1;

echo $a . PHP_EOL;
echo $b . PHP_EOL;
echo $c . PHP_EOL;
echo $d . PHP_EOL;
// вывод:
9223372036854775807
9.2233720368548E+18
-9223372036854775808
-9.2233720368548E+18


Для того чтобы вывести int переменную не в десятичной, а другой системе счисления, нужно воспользоваться функциями форматирования, например, sprintf/printf:

$a = 42;

echo sprintf("%o", $a) . PHP_EOL;  // восьмеричная
echo sprintf("%x", $a) . PHP_EOL;  // шестнадцатиричная, буквы в нижнем регистре
echo sprintf("%X", $a) . PHP_EOL;  // шестнадцатиричная, буквы в верхнем регистре
echo sprintf("%b", $a) . PHP_EOL;  // двоичная
// вывод:
52
2a
2A
101010


Переходим к выводу переменных типа float.

$floatNums = [
    // Первый способ записи float-чисел
    4.2,
    4.2222,
    4.22222222,
    0.2,
    0.0002,
    0.00002,
    0.000002,
    // Второй способ записи float-чисел
    1.2e4,
    // Третий способ записи float-чисел
    1.2E4,
    5E-3,
    5E-4,
    5E-5,
    // int значения превышающие размер типа int конвертируются во float
    PHP_INT_MAX + 20,
];

foreach ($floatNums as $num) {
    echo $num . PHP_EOL;
}
// вывод:
4.2
4.2222
4.22222222
0.2
0.0002
2.0E-5    //числа с пятью и более знаками после запятой выводятся в нотации с основанием и мантиссой
2.0E-6
12000
12000
0.005
0.0005
5.0E-5
9.2233720368548E+18


Как видим - числа выводятся с тем же количеством знаков после запятой, что были указаны при их объявлении. Для указания нужного числа знаков после запятой - пользуйтесь функциями форматирования, например, теми же sprintf/printf или number_format:

$floatNum = 4.23456789;
echo sprintf('%f', $floatNum) . PHP_EOL;
echo sprintf('%.2f', $floatNum) . PHP_EOL;
echo sprintf('%.5f', $floatNum) . PHP_EOL;
echo sprintf('%.12f', $floatNum) . PHP_EOL;

echo number_format($floatNum) . PHP_EOL;
echo number_format($floatNum, 2) . PHP_EOL;
echo number_format($floatNum, 5) . PHP_EOL;
echo number_format($floatNum, 6) . PHP_EOL;

// вывод
4.234568   // по умолчанию выводится 6 знаков после запятой
4.23
4.23457    // можно подумать что это округление, но нет, такой вывод связан с представлением числа в памяти программы
4.234567890000     // оставшиеся позиции заменяются нулями
4
4.23
4.23457    // аналогично, это НЕ округление
4.234568


Оставшиеся типы данных - массив, объект и ресурс, рассмотрим в заключительном посте.