Типы данных в программировании: какие бывают и чем int отличается от float

Тип данных говорит программе, что лежит в переменной: целое число, дробное, строка, логическое значение или набор значений.

Разбираю основные типы на примерах кода на Python, JavaScript и C: чем int отличается от float, почему 0.1 + 0.2 не равно 0.3 и чем строгая типизация отличается от слабой.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3177 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3831 экспертное мнение Подписаться на Телеграм-канал
Обложка: Типы данных в программировании: какие бывают и чем int отличается от float

Тип данных — это правило, которое говорит программе, что лежит в переменной и что с этим можно делать. Число 5 можно умножить, строку «5» можно только склеить с другой строкой, а True отвечает на вопрос «да или нет». Тип задаёт три вещи: какие значения допустимы, какие операции с ними работают и сколько места они занимают в памяти.

Почти в любом языке есть одинаковый базовый набор: целые числа, дробные числа, строки и логический тип. Поверх них строятся составные типы: массивы, словари, объекты. Ниже разбираю каждый на примерах кода на Python, JavaScript и C, которые я запускал перед публикацией. Если вы только начинаете, сначала загляните в основы программирования: там восемь понятий, без которых типы читаются тяжело.

CheckroiCheckroiПодборка курсов по основам программирования14 курсов • 8 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Зачем нужны типы данных

Рой раскладывает данные по подписанным ящикам

Компьютер хранит всё в виде нулей и единиц. Одна и та же последовательность битов может быть числом, буквой или цветом пикселя. Тип объясняет программе, как эти биты читать.

Разница видна на простом примере. Сложим два числа и две строки в Python:

print(5 + 3)
print("5" + "3")
8
53

Знак + один, а результат разный, потому что у значений разные типы. Для чисел плюс означает сложение, для строк он склеивает текст.

Зачем это нужно на практике:

  • Защищают от бессмыслицы. Язык не даст разделить имя пользователя на дату рождения.
  • Экономят память. Флаг «оплачено или нет» не должен занимать столько же места, сколько длинный текст.
  • Ускоряют код. Когда компилятор заранее знает тип, он выбирает быстрые машинные команды.

Тип всегда привязан к значению, а иногда и к имени, в котором значение хранится. Как устроены имена и присваивание, подробно разобрано в статье что такое переменная в программировании.

Основные типы данных: шпаргалка

Названия в языках отличаются, но смысл совпадает. Вот как базовые типы называются в четырёх популярных языках:

Что хранит Пример Python JavaScript Java C
Целое число 42 int number, bigint byte, short, int, long char, short, int, long
Дробное число 3.14 float number float, double float, double
Строка "кот" str string String массив char
Один символ 'к' нет, строка длины 1 нет, строка длины 1 char char
Логическое значение true bool boolean boolean _Bool (с C99), bool (с C23)
«Пусто» нет значения None null, undefined null NULL для указателей
Набор значений [1, 2, 3] list, tuple Array массив, ArrayList массив
Пары «ключ: значение» {"имя": "Аня"} dict Object, Map HashMap struct

Когда спрашивают про «4 типа данных», обычно имеют в виду школьную классификацию из информатики: целый, вещественный, логический и символьный (строковый). Все четыре есть в таблице выше: целое и дробное число, логическое значение и строка с символом.

Все типы делят на две большие группы:

  • Простые (примитивные) хранят одно неделимое значение: число, символ, true или false.
  • Составные собирают несколько значений в одну структуру: массив, словарь, объект.

Проверить тип в Python можно функцией type():

print(type(42), type(3.14), type("кот"), type(True), type(None))
print(type([1, 2]), type({"имя": "Аня"}))
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'>
<class 'list'> <class 'dict'>
Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Числа: целые и дробные

Чисел в программировании два вида, и путать их опасно. Целые считают штуки: товары в корзине, номер строки, возраст. Дробные нужны для измерений: вес, температура, координаты.

Целые числа: int

Integer, или int, хранит целое число без дробной части. В большинстве языков у него есть предел. В Java int занимает 32 бита и вмещает числа от −231 до 231−1, а для больших значений есть long на 64 бита, это прописано в документации Oracle.

В C размер int зависит от платформы. Стандарт гарантирует только минимум в 16 бит, большинство современных систем дают 32, пишет cppreference. Что бывает, когда число не влезает, видно на беззнаковом типе на 1 байт:

#include <stdio.h>

int main(void) {
    printf("char: %zu, int: %zu, long long: %zu, double: %zu\n",
           sizeof(char), sizeof(int), sizeof(long long), sizeof(double));

    unsigned char level = 255;
    level = level + 1;
    printf("255 + 1 = %d\n", level);
    return 0;
}
char: 1, int: 4, long long: 8, double: 8
255 + 1 = 0

Размеры в байтах получены на Mac с процессором arm64. Переменная дошла до максимума 255 и после прибавления единицы обнулилась. Это называется переполнение, и компилятор о нём не предупредит.

Python устроен иначе: его int растёт сколько нужно. В документации Python так и написано: у целых чисел неограниченная точность.

print(2 ** 100)
1267650600228229401496703205376

Дробные числа: float и double

Float хранит число с плавающей запятой. В Java float занимает 32 бита, double 64, оба по стандарту IEEE 754, это есть в той же документации Oracle. Тип number в JavaScript устроен как double в Java, пишет MDN. Float в Python на практически любом компьютере тоже 64-битный.

Float хранит число приблизительно. Десятичная дробь 0,1 в двоичной системе бесконечна, поэтому её округляют:

print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
0.30000000000000004
False

JavaScript выдаёт тот же 0.30000000000000004. Так устроен сам формат, подробности есть в учебнике Python про арифметику с плавающей точкой.

Для денег float не подходит. В Python берут модуль decimal, в базах данных тип numeric. Документация PostgreSQL прямо рекомендует его для денежных сумм.

from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))
0.3

Float появляется и там, где его не ждали. Обычное деление через / и квадратный корень в Python возвращают дробное число, даже если ответ целый:

import math
print(10 / 5, math.sqrt(16))
2.0 4.0

Если дальше это число пойдёт в индекс списка или в range(), его придётся явно перевести в int. Другие способы извлечь корень и какой тип возвращает каждый, собраны в статье про корень в Python.

Чем int отличается от float

int float
Что хранит Целые числа Числа с дробной частью
Точность Точная, пока число в пределах типа Приблизительная, у 64-битного надёжны около 15 знаков
Для чего Счётчики, индексы, количество Измерения, физика, графика
Деньги Подходит, если хранить копейки Не подходит

Ещё они по-разному делятся. В C деление двух целых отбрасывает дробную часть:

int a = 7, b = 2;
printf("7 / 2 = %d\n", a / b);
printf("7.0 / 2 = %.1f\n", 7.0 / b);
7 / 2 = 3
7.0 / 2 = 3.5

В Python оператор / всегда возвращает float, а целочисленное деление делают через //: 7 / 2 даёт 3.5, 7 // 2 даёт 3.

Сравнивать два float через == рискованно по той же причине, что и с 0.1 + 0.2. Чем отличаются операторы сравнения и где новички ошибаются с !=, разобрано в статье не равно в Python.

Строки, символы и логический тип

Строка: string

Строка хранит последовательность символов: имя, адрес, текст сообщения. В кавычках число превращается в строку, поэтому "42" и 42 относятся к разным типам.

Для русского текста есть подвох: длина строки в символах и в байтах не совпадает. В кодировке UTF-8 латинская буква занимает 1 байт, а кириллическая 2, это следует из спецификации RFC 3629.

s = "Привет"
print(len(s), len(s.encode("utf-8")))
print(len("Hello"), len("Hello".encode("utf-8")))
6 12
5 5

Шесть букв, но двенадцать байтов. Если поле в базе ограничено байтами, кириллическое имя упрётся в лимит вдвое раньше латинского.

Символ: char

Отдельный тип для одного символа есть в C и Java. В C char занимает 1 байт, в Java 16 бит, и он хранит символ Unicode. В Python и JavaScript такого типа нет: один символ там просто строка длиной 1.

Логический тип: boolean

Логический тип хранит только два значения: истину и ложь. Он нужен в условиях и проверках: оплачен ли заказ, вошёл ли пользователь. Подробно про него рассказано в статье что такое boolean.

В Python bool технически подвид int, поэтому с ним можно считать:

print(True + True, isinstance(True, int))
2 True

Составные типы: массивы, словари и объекты

Список, словарь и множество в виде предметов на столе

Составной тип хранит сразу много значений. Основные виды:

  • Массив или список: упорядоченный набор, к элементу обращаются по номеру. Чем массив отличается от списка, разобрано в статье что такое массив, а методы списков описаны в материале про списки в Python.
  • Словарь (в JavaScript его роль играет объект) хранит пары «ключ: значение»: {"имя": "Аня", "возраст": 25}.
  • Множество: набор без повторов, удобно убирать дубли. Примеры есть в статье про множества в Python.
  • Структура или класс: свой тип из нескольких полей, например «Пользователь» с именем, почтой и датой регистрации.

Значение и ссылка

С составными типами есть ловушка. Переменная со списком хранит ссылку на него, а сам список лежит в памяти отдельно. Присвоили список второй переменной и получили второе имя для того же объекта:

cart = ["хлеб", "молоко"]
copy = cart
copy.append("сыр")
print(cart)

safe = cart.copy()
safe.append("чай")
print(cart)
['хлеб', 'молоко', 'сыр']
['хлеб', 'молоко', 'сыр']

Сыр появился в исходной корзине, хотя добавляли его в copy. А вот чай после .copy() в неё не попал. Со строками и числами такого не случится: в документации Python они названы неизменяемыми, в отличие от списков и словарей.

Пустое значение: null, None, undefined

Отдельный случай, значение «ничего». В Python это None, в Java null, в JavaScript сразу два: undefined (значение не задали) и null (задали пустоту намеренно).

let x;
console.log(typeof x, typeof null);
undefined object

typeof null возвращает "object". Так повелось с первой реализации языка: исправление предлагали, но его отклонили, пишет MDN. Всего в JavaScript восемь типов: семь примитивных и Object, полный список есть в справочнике MDN по типам и структурам данных.

Типизация: статическая и динамическая, сильная и слабая

Типизацией называют правила, по которым язык следит за типами. Простыми словами, она отвечает на два вопроса: когда проверяется тип и разрешает ли язык смешивать разные типы. Все виды типизации с примерами языков подробно разобраны в отдельной статье про типизацию в программировании.

  • Статическая: тип известен до запуска, ошибку покажет компилятор. Так работают Java, C, C#, Go.
  • Динамическая: тип выясняется во время работы программы. Так работают Python и JavaScript.
  • Сильная (строгая): язык не смешивает типы молча и требует явного преобразования.
  • Слабая: язык сам приводит типы друг к другу, иногда неожиданно.

Оси независимы, поэтому языки раскладываются по таблице:

Сильная Слабая
Статическая Java, C#, Go C
Динамическая Python, Ruby JavaScript, PHP

Строгую динамическую типизацию Python и слабую у JavaScript видно на одной операции. JavaScript склеивает строку с числом, а при вычитании превращает строку в число:

console.log("5" + 3);
console.log("5" - 3);
53
2

Python на ту же операцию отвечает ошибкой:

print("5" + 3)
TypeError: can only concatenate str (not "int") to str

Ещё есть деление на явную и неявную типизацию: пишете ли вы тип руками (int age = 25 в Java) или язык выводит его сам (age = 25 в Python). Для JavaScript есть надстройка TypeScript, которая добавляет статические типы, их базовый набор описан в справочнике TypeScript. Как типизация выглядит на переменных, разобрано в статье про синтаксис Python.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Как узнать тип и преобразовать его

Данные из формы, файла или API почти всегда приходят строкой. Прежде чем считать, их переводят в число. Основные команды:

Задача Python JavaScript
Узнать тип type(x), isinstance(x, int) typeof x
Строка → целое int("42") Number("42"), parseInt("42")
Строка → дробное float("3.5") Number("3.5")
Число → строка str(10) String(10)

Проверка на живом коде:

print(int("42") + 1, float("3.5"), str(10) + " лет")
43 3.5 10 лет

Если строку нельзя прочитать как число, Python бросит исключение, а JavaScript вернёт NaN:

int("3.5")
# ValueError: invalid literal for int() with base 10: '3.5'
console.log(Number("abc"));
// NaN

Чтобы программа не падала на кривом вводе, преобразование оборачивают в обработку ошибок. Как это сделать, показано в статье try except в Python.

Частые ошибки с типами данных

Рой радуется, что программа заработала после исправления типов
  1. Деньги во float. Копейки теряются при сложении тысяч операций. Решение: Decimal в Python, numeric в базе или целое число копеек.
  2. Сравнение дробных через ==. 0.1 + 0.2 == 0.3 даёт False. Решение: сравнивать с допуском, в Python для этого есть math.isclose().
  3. Строка вместо числа. Сумма «10» и «5» из формы превращается в «105». Решение: приводить ввод к числу сразу после получения.
  4. Целочисленное деление. В C и Java 7 / 2 даёт 3, и среднее значение молча округляется. Решение: сделать хотя бы один операнд дробным.
  5. Переполнение. Счётчик в маленьком типе доходит до максимума и обнуляется или уходит в минус. Решение: брать тип с запасом, например long вместо int для идентификаторов.
  6. Общий список на две переменные. Правка через одно имя меняет данные под другим. Решение: делать копию через .copy() или срез.

Где освоить программирование системно

Типы данных проходят в начале почти любого курса, но запоминаются они только на практике: когда сами ловите TypeError и разбираетесь, откуда взялся лишний ноль после запятой. Курсы ниже начинают с основ и дают задачи с проверкой кода.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Алгоритмы и структуры данных
Перейти на сайт курса
SkillFactorySkillFactory78 840 ₽2190 ₽/мес.5 месяцевОбзор курса
Алгоритмы и структуры данных. Базовый курс
Перейти на сайт курса
GeekBrainsGeekBrains15 000 ₽417 ₽/мес.1 месяцОбзор курса
Алгоритмы и структуры данных на Python. Базовый курс
Перейти на сайт курса
GeekBrainsGeekBrains15 000 ₽417 ₽/мес.1 месяцОбзор курса
Алгоритмы и циклы
Перейти на сайт курса
FoxfordФоксфорд4200 ₽2690 ₽/мес.Обзор курса
Информатика и вычислительная техника
Перейти на сайт курса
ИПО — институт профессионального образованияИПО32 900 ₽2633 ₽/мес.512 часовОбзор курса

Больше программ — в полном каталоге курсов по основам программирования

Если уже понятно, с какого языка начинать, посмотрите курсы по Python или весь каталог курсов программирования. Если не определились, начните с разбора первой программы на Python: там видно, как типы работают в настоящей задаче.

Часто задаваемые вопросы

Что такое тип данных простыми словами?

Это ярлык на значении, по которому программа понимает, что с ним можно делать. Число 5 можно умножить, строку «5» можно только склеить с другой строкой, а True пригодится в условии.

Какие типы данных бывают?

Простые: целые числа (int), дробные (float, double), строки (string), символы (char) и логический тип (boolean). Составные: массивы и списки, словари, множества, структуры и классы. Отдельно стоит пустое значение: null, None или undefined.

Какие 4 типа данных изучают в информатике?

Обычно имеют в виду целый, вещественный, логический и символьный (строковый). Это базовый набор, который есть почти в любом языке под разными названиями.

Чем int отличается от float?

int хранит целые числа точно, float хранит дробные приблизительно. Поэтому 0.1 + 0.2 в Python и JavaScript даёт 0.30000000000000004, а деньги считают в Decimal или в целых копейках.

Что такое строгая типизация?

Это когда язык не смешивает разные типы сам. В Python "5" + 3 вызывает ошибку TypeError, а JavaScript со слабой типизацией молча вернёт строку «53».

Чем статическая типизация отличается от динамической?

При статической тип известен до запуска программы и ошибку покажет компилятор, так работают Java и C. При динамической тип выясняется во время работы, так устроены Python и JavaScript.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!