Определение типа числа в программировании: float или int?
Быстрый ответ
Для определения типа числа — целого или дробного — можно использовать выражение (num % 1) !== 0
, если предполагается работа с числом с плавающей точкой, или функцию Number.isInteger(num)
, если ожидаются целые числа. Иллюстрация на JavaScript коде:
const num = 10.5;
console.log(`Если это дробное число, то: ${ (num % 1) !== 0 }`); // true, потому что у числа 10.5 есть дробная часть
console.log(`Если это целое число, то: ${ Number.isInteger(num) }`); // false, число 10.5 не является целым
Различие между целыми и дробными числами
Для точного определения, является ли число целым или дробным, необходимо улавливать их основные характеристики. Целыми числами мы называем числа без дробной части, то есть это полный набор единиц. Дробные числа, которыми являются "числа с плавающей точкой", всегда содержат дробную часть, даже если это ноль (например, 5.0
).
Методы определения типа числа в JavaScript
JavaScript предлагает несколько методов для определения типа числа. Поговорим о них подробнее, не забывая о тонкостях и возможных подводных камнях.
Проверка на число
Сначала стоит удостовериться, что значение, на котором мы делаем проверку, действительно является числовым. Вот как это осуществить:
function isValidNumber(value) {
return Number(value) === value;
}
Полифил для Number.isInteger()
В стандарте ES5 функции Number.isInteger()
нет в наличии. Решить эту проблему поможет следующий полифил:
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
Учет "небезопасных" чисел
JavaScript определяет пороговое значение для наибольшего безопасного числа (Number.MAX_SAFE_INTEGER
). Выход за границы этого значения может влиять на точность проверок. Особое внимание стоит уделить обработке подобных значений.
Побитовые операции для определения целых чисел
Побитовые операции также подойдут для определения целых чисел, однако будьте внимательны: они корректно работают только с числами, которые не превышают 32-битный диапазон:
function isIntUsingBitwise(value) {
return (value | 0) === value;
}
Использование parseInt()
с проверкой на равенство
Сочетание функции parseInt()
с оператором равенства позволит выявлять целочисленные значения:
function isParsedInt(value) {
return parseInt(value, 10) === value;
}
Однако стоит помнить, что parseInt
приводит строки к числам, что может вызвать непредвиденные результаты: строка "123abc"
будет интерпретирована как число 123
.
Использование регулярных выражений для нахождения целых чисел в строках
Регулярные выражения могут быть удобным инструментом для проверки строк, содержащих целые числа:
const isIntRegex = /^-?\d+$/;
console.log(isIntRegex.test("10")); // true, потому что число 10, очевидно, является целым
Основные принципы безопасной работы с числами
Зная основные особенности JavaScript, можно избежать большинства ошибок:
- Производите проверку на конечность: функция
isFinite()
поможет верифицировать значение перед определением его типа. - Проверяйте границы: значения, приближающиеся к
Number.MIN_VALUE
иNumber.MAX_SAFE_INTEGER
, требуют особого внимания. - Не забывайте об отрицательных целых числах: они также должны участвовать в проверках.
- Строки, похожие на числа: приводите их к числовому виду перед тем как определить их тип.
Визуализация
В качестве визуализации можно представить, что вы разделяете яблоки (🍏) и персики (🍑):
Ведро А (🍏): Целые числа – они стабильны и надежны
Ведро В (🍑): Дробные числа – они менее предсказуемы
Принцип работы следующий:
Number.isInteger(value) ? '🍏' : '🍑';
Визуальная аналогия:
🔢 Число: 5 → 🍏 (Стабильно, целое)
🔢 Число: 5.2 → 🍑 (Менее стабильно, дробное)
Обозначения для ведер:
🍏 Целые числа поместим в это ведро: [1, 2, 3, ...]
🍑 Дробные числа пойдут сюда: [1\.1, 2.5, 3.14159, ...]
Запомните: Каждому числу свое ведро!
Бонус: Проверка чисел со сложной структурой
Числа могут иметь сложные формы и представляться различными типами.
Экспоненциальная запись числа
Выражения вроде 1e2
считаются целыми числами. Переведите их в стандартный формат перед проверкой типа:
function isIntExponential(value) {
return Number.isInteger(Number(value));
}
Проверка шестнадцатеричных и двоичных чисел
JavaScript интерпретирует строки, начинающиеся на 0x
, как шестнадцатеричные числа, и строки, начинающиеся на 0b
, — как двоичные. Их следует преобразовать перед проверкой:
const hex = "0xFF";
console.log(Number.isInteger(parseInt(hex, 16))); // true, потому что шестнадцатеричное число также имеет числовое значение
Аналоги функций в языке PHP
Если вы знакомы с языком PHP, для вас не станут новостью функции is_int()
, is_float()
и ctype_digit()
.