Как определить какое число больше в javascript
Перейти к содержимому

Как определить какое число больше в javascript

  • автор:

BigInt

Эта возможность была добавлена в язык недавно. Узнать, где есть поддержка, можно на https://caniuse.com/#feat=bigint.

BigInt – это специальный числовой тип, который предоставляет возможность работать с целыми числами произвольной длины.

Чтобы создать значение типа BigInt , необходимо добавить n в конец числового литерала или вызвать функцию BigInt , которая создаст число типа BigInt из переданного аргумента. Аргументом может быть число, строка и др.

const bigint = 1234567890123456789012345678901234567890n; const sameBigint = BigInt("1234567890123456789012345678901234567890"); const bigintFromNumber = BigInt(10); // то же самое, что и 10n

Математические операторы

BigInt можно использовать как обычные числа, к примеру:

alert(1n + 2n); // 3 alert(5n / 2n); // 2

Обратите внимание: операция деления 5/2 возвращает округлённый результат, без дробной части. Все операции с числами типа bigint возвращают bigint .

В математических операциях мы не можем смешивать bigint и обычные числа:

alert(1n + 2); // Error: Cannot mix BigInt and other types

Мы должны явно их конвертировать: используя либо BigInt() , либо Number() , например:

let bigint = 1n; let number = 2; // конвертируем number в bigint alert(bigint + BigInt(number)); // 3 // конвертируем `bigint` в number alert(Number(bigint) + number); // 3

Конвертирование bigint в число всегда происходит неявно и без генерации ошибок, но если значение bigint слишком велико и не подходит под тип number , то дополнительные биты будут отброшены, так что следует быть осторожными с такими преобразованиями.

К BigInt числам нельзя применить унарный оператор +

Унарный оператор +value является хорошо известным способом конвертировать произвольное значение value в число.

Данный оператор не поддерживается при работе с BigInt числами:

let bigint = 1n; alert( +bigint ); // Ошибка!

Мы должны использовать Number() для преобразования bigint к number .

Операции сравнения

Операции сравнения, такие как < , >, работают с bigint и обычными числами как обычно:

alert( 2n > 1n ); // true alert( 2n > 1 ); // true

Пожалуйста, обратите внимание, что обычные и bigint числа принадлежат к разным типам, они могут быть равны только при нестрогом сравнении == :

alert( 1 == 1n ); // true alert( 1 === 1n ); // false

Логические операции

В if или любом другом логическом операторе bigint число ведёт себя как обычное число.

К примеру, в if bigint 0n преобразуется в false , другие значения преобразуются в true :

if (0n) < // никогда не выполнится >

Логические операторы || , && и другие также работают с bigint числами как с обычными числами:

alert( 1n || 2 ); // 1 alert( 0n || 2 ); // 2

Полифилы

Создание полифила для BigInt – достаточно непростая задача. Причина в том, что многие операторы в JavaScript, такие как + , — и др., ведут себя по-разному с bigint по сравнению с обычными числами.

К примеру, деление bigint числа всегда возвращает bigint (округлённое при необходимости).

Чтобы эмулировать такое поведение, полифил должен будет проанализировать код и заменить все такие операторы на свои вызовы. Такая реализация будет тяжеловесной, не очень хорошей с точки зрения производительности.

Вот почему на данный момент нет хорошо реализованного полифила.

Существует обратное решение, предложеное разработчиками библиотеки JSBI.

Эта библиотека реализует большие числа, используя собственные методы. Мы можем использовать их вместо встроенных BigInt :

Операция Встроенный BigInt JSBI
Создание из number a = BigInt(789) a = JSBI.BigInt(789)
Сложение c = a + b c = JSBI.add(a, b)
Вычитание c = a — b c = JSBI.subtract(a, b)

…А затем использовать полифил (плагин Babel) для замены вызовов JSBI на встроенные Bigint для браузеров, которые их поддерживают.

Другими словами, данный подход предлагает использовать JSBI вместо встроенных BigInt . JSBI внутри себя работает с числами как с BigInt , эмулирует их с соблюдением всех требований спецификации. Таким образом, мы можем выполнять JSBI-код в интерпретаторах, которые не поддерживают Bigint , а для тех, которые поддерживают – полифил преобразует вызовы в обычные Bigint .

Ссылки

  • MDN: BigInt.
  • Спецификация: BigInt.

Number.isInteger()

Метод Number.isInteger() определяет, является ли переданное значение целым числом.

Интерактивный пример

Синтаксис

Number.isInteger(value)

Параметры

Значение, проверяемое на целочисленность.

Возвращаемое значение

Boolean сообщающий о том, является ли переданное значение целочисленным числом.

Описание

Если целевое значение является целым числом, возвращает true . Если значение NaN или Infinity , то возвращает false . Метод также возвращает true , если это вещественное число с точкой, которое может быть представлено в целочисленном виде.

Примеры

.isInteger(0); // true Number.isInteger(1); // true Number.isInteger(-100000); // true Number.isInteger(99999999999999999999999); // true Number.isInteger(0.1); // false Number.isInteger(Math.PI); // false Number.isInteger(NaN); // false Number.isInteger(Infinity); // false Number.isInteger(-Infinity); // false Number.isInteger("10"); // false Number.isInteger(true); // false Number.isInteger(false); // false Number.isInteger([1]); // false Number.isInteger(5.0); // true Number.isInteger(5.000000000000001); // false Number.isInteger(5.0000000000000001); // true 

Полифил

.isInteger = Number.isInteger || function (value)  return ( typeof value === "number" && isFinite(value) && Math.floor(value) === value ); >; 

Спецификации

Specification
ECMAScript Language Specification
# sec-number.isinteger

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Объект Number , которому принадлежит этот метод.

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 20 янв. 2024 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.

BigInt

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2020 .

BigInt это встроенный объект, который предоставляет способ представлять целые числа больше 253 — 1, наибольшего числа, которое JavaScript может надёжно представить с Number примитивом. Это максимальное значение можно получить, обратившись к Number.MAX_SAFE_INTEGER .

Описание

BigInt создаётся путём добавления n в конец целочисленного литерала — 10n — или вызовом функции BigInt() .

const theBiggestInt = 9007199254740991n; const alsoHuge = BigInt(9007199254740991); // ↪ 9007199254740991n const hugeString = BigInt("9007199254740991"); // ↪ 9007199254740991n const hugeHex = BigInt("0x1fffffffffffff"); // ↪ 9007199254740991n const hugeBin = BigInt( "0b11111111111111111111111111111111111111111111111111111", ); // ↪ 9007199254740991n 

В некотором смысле он похож на Number , но отличается в некоторых ключевых моментах — его нельзя использовать с методами во встроенном объекте Math и нельзя смешивать в операциях с любыми экземплярами Number.

Предупреждение: Number и BigInt нельзя смешивать в операциях — они должны быть приведены к тому же типу.

Будьте осторожны приводя значения туда и обратно, так как точность BigInt может быть потеряна при приведении к числу ( Number) .

Тип

При проверке с использованием оператора typeof , BigInt выдаёт тип «bigint» :

typeof 1n === "bigint"; // true typeof BigInt("1") === "bigint"; // true 

При оборачивании в объект, BigInt будет представлен как обычный объект:

typeof Object(1n) === "object"; // true 

Операторы

Следующие операторы могут использоваться с BigInt (или объектом-обёрткой BigInt ): + , * , — , ** , % .

Побитовые операции (en-US) также поддерживаются, кроме >>> (сдвиг вправо с заполнением нулями).

Не поддерживаемый унарный оператор ( + ) больше не ломает asm.js.

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER); // ↪ 9007199254740991n const maxPlusOne = previousMaxSafe + 1n; // ↪ 9007199254740992n const theFuture = previousMaxSafe + 2n; // ↪ 9007199254740993n, это работает! const multi = previousMaxSafe * 2n; // ↪ 18014398509481982n const subtr = multi – 10n; // ↪ 18014398509481972n const mod = multi % 10n; // ↪ 2n const bigN = 2n ** 54n; // ↪ 18014398509481984n bigN * -1n // ↪ –18014398509481984n 

Оператор / также работает, как и ожидалось, с целыми числами. Однако, поскольку это BigInt, эта операция будет округляться в меньшую сторону, то есть она не будет возвращать какие-либо дробные цифры.

Предупреждение: Результат операции с дробным результатом будет округлён в меньшую сторону при использовании BigInt .

const expected = 4n / 2n; // ↪ 2n const rounded = 5n / 2n; // ↪ 2n, not 2.5n 

Сравнения

BigInt равен Number только при нестрогом сравнении.

0n === 0; // ↪ false 0n == 0; // ↪ true 

Обычные числа и BigInt можно сравнивать как обычно.

1n  2; // ↪ true 2n > 1; // ↪ true 2 > 2; // ↪ false 2n > 2; // ↪ false 2n >= 2; // ↪ true 

Они могут быть смешаны в массивах и отсортированы:

const mixed = [4n, 6, -12n, 10, 4, 0, 0n]; // ↪ [4n, 6, -12n, 10, 4, 0, 0n] mixed.sort(); // ↪ [-12n, 0, 0n, 10, 4n, 4, 6] 

Обратите внимание, что сравнения с обьектом -обёрткой BigInt действуют как с другими объектами, указывая на равенство только когда сравнивается идентичный экземпляр объекта:

0n === Object(0n); // false Object(0n) === Object(0n); // false const o = Object(0n); o === o; // true 

Условные выражения

BigInt ведёт себя как обычное число в следующих случаях:

  • Преобразуется в Boolean через функцию Boolean
  • Используется с логическими операторами Logical Operators (en-US) || , && и !
  • В условном тесте, таком как if statement .
if (0n)  console.log("Привет из if!"); > else  console.log("Привет из else!"); > // ↪ "Привет из else!" 0n || 12n; // ↪ 12n 0n && 12n; // ↪ 0n Boolean(0n); // ↪ false Boolean(12n); // ↪ true !12n; // ↪ false !0n; // ↪ true 

Конструктор

Статические методы

Оборачивает BigInt в пределах от -2width-1 до 2width-1-1

Оборачивает a BigInt в пределах от 0 до 2width-1

Методы экземпляра

Возвращает строку с языкозависимым представлением числа. Переопределяет метод Object.prototype.toLocaleString() .

Возвращает строку, представляющую указанный объект по указанному основанию системы счисления. Переопределяет метод Object.prototype.toString() .

Возвращает примитивное значение указанного объекта. Переопределяет метод Object.prototype.valueOf() .

Рекомендации по использованию

Приведение

Поскольку приведение между Number и BigInt может привести к потере точности, рекомендуется использовать BigInt только тогда, когда разумно ожидаются значения, превышающие 253 и не приводить между двумя типами.

Криптография

Операции поддерживаемые BigInt не постоянны во времени. BigInt следовательно не пригоден для использования в криптографии.

Использование вместе с JSON

Использование JSON.stringify() с любым значением типа BigInt приведёт к TypeError , поскольку значения BigInt не преобразуется в JSON по умолчанию, однако вы можете реализовать свой собственный метод toJSON , если вам необходимо:

BigInt.prototype.toJSON = function ()  return this.toString(); >; 

Теперь вместо ошибки, JSON.stringify будет создавать строку:

JSON.stringify(BigInt(1)); // '"1"' 

Примеры

Расчёт простых чисел

// Возвращает true, если BigInt — простое число function isPrime(p)  for (let i = 2n; i * i  p; i++)  if (p % i === 0n) return false; > return true; > // Берет BigInt в качестве аргумента и возвращает BigInt function nthPrime(nth)  let maybePrime = 2n; let prime = 0n; while (nth >= 0n)  if (isPrime(maybePrime))  nth--; prime = maybePrime; > maybePrime++; > return prime; > nthPrime(20n); // ↪ 73n 

Спецификации

Specification
ECMAScript Language Specification
# sec-bigint-objects

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Number
  • Number.MAX_SAFE_INTEGER

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 6 янв. 2024 г. by MDN contributors.

Your blueprint for a better internet.

Math.max()

Метод Math.max() возвращает наибольшее из нуля или более чисел.

Синтаксис

Math.max([value1[, value2[, . ]]])

Параметры

Описание

Поскольку метод max() является статическим методом объекта Math , вы всегда должны использовать его как Math.max() , а не пытаться вызывать метод на созданном экземпляре объекта Math (поскольку объект Math не является конструктором).

При вызове без аргументов результатом вызова будет значение — Infinity .

Если хотя бы один из аргументов не может быть преобразован в число, результатом будет NaN .

Примеры

Пример: использование метода Math.max()

.max(10, 20); // 20 Math.max(-10, -20); // -10 Math.max(-10, 20); // 20 
Нахождение максимального элемента в массиве

Следующая функция использует метод Function.prototype.apply() для нахождения максимального элемента в числовом массиве. Вызов getMaxOfArray([1, 2, 3]) эквивалентен вызову Math.max(1, 2, 3) , однако вы можете использовать функцию getMaxOfArray() вместе с программно сконструированными массивами любого размера. Рекомендуется использовать только в случае обработки массивов с небольшим количеством элементов.

function getMaxOfArray(numArray)  return Math.max.apply(null, numArray); > 

Спецификации

Specification
ECMAScript Language Specification
# sec-math.max

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 20 янв. 2024 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *