Главная страница » Как сравнить только дробные части чисел js

Как сравнить только дробные части чисел js

  • автор:

Работа с числами в JavaScript

Работа с числами в JavaScript

В JavaScript в отличие от некоторых других языков имеется только один числовой тип number . В нём используется формат чисел с плавающей точкой двойной точности по стандарту IEEE 754.

То есть, в JavaScript нет отдельного формата для целых чисел. Все числа в JavaScript имеют плавающую точку.

Пример записи чисел:

Как показано в примере, в JavaScript числа можно записывать в экспоненциальной форме, а также задавать в других системах счисления: в восьмеричной (впереди 0 ) и шестнадцатеричной (впереди 0x ).

Узнать какой тип данных содержит переменная можно с помощью typeof :

Кроме чисел, формат number также содержит специальные числовые значения:

  • положительную бесконечность: Infinity ;
  • отрицательную бесконечность: -Infinity ;
  • не число: NaN .

Примеры выражений, результаты вычисления которых возвращают специальные числовые значения:

В JavaScript не возникают ошибки при выполнении математических операций. Если в результате вычисления получается очень большое число или очень маленькое выходящее за допустимые границы, то интерпретатор возвращает соответственно Infinity или -Infinity .

NaN возвращается, когда интерпретатор JavaScript не может вычислить математическую операцию. Например, когда мы попытаемся от числа 3 отнять строку ‘1rem’ .

Числовой тип number является примитивным типом. Но при этом к числам можно применять методы как к объектам. Это осуществляется посредством обёртки Number . Она содержит дополнительные значения и методы для работы с числами:

В этом примере мы применили к примитивному типу данных метод toString() как к объекту. При вызове метода числа автоматически оборачиваются в обёртку Number() , а у обёртки имеется метод toString() . Этот метода преобразует число в строку. Этот пример показывает, что числа ведут себя как объекты, хотя на самом деле ими не являются.

При этом использовать обёртку Number напрямую для создания чисел крайне не рекомендуется:

В этом примере num1 и num2 имеют разные типы.

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

Кстати, на самом деле в JavaScript 2 числовых типа данных. Второй тип был добавлен в спецификацию ECMAScript 2020 (11 редакция). Называется он bigint . Этот тип предназначен для представления очень больших целых чисел и на практике используется только для чисел, которые слишком велики для представления с помощью number .

Ограничения по максимальному размеру и точность чисел

В JavaScript при сложении чисел с дробной частью можно получить не то число, которое ожидали.

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

Например, число 0.2510 в двоичную систему преобразуется точно:

Например, число 0.210 можно преобразовать в двоичную систему только с определённой точностью:

В результате эти погрешности скажутся при вычислении выражений и это нужно учитывать при написании кода в JavaScript.

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

Например, перепишем код, приведённый выше с определённой точностью используя метод toFixed :

В этом примере, мы сначала с использованием метода toFixed(2) получили строковое представление числа, которое является результатом сложения чисел 0.2 и 0.4 , округленных до 2 знаков после точки. После этого с помощью метода parseFloat преобразовали текст в число и полученное значение присвоили переменной num .

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

Получить минимальное и максимальное безопасное целое число можно с помощью констант:

Теперь, если проверим число, приведённое выше, то увидим что оно больше безопасного:

Кроме этого, проверить находится ли целое число в пределах безопасного диапазона можно посредством метода isSafeInteger :

Основные арифметические операторы

В JavaScript имеются следующие математические операторы:

  • сложение: + ;
  • вычитание: — ;
  • умножение: * ;
  • деление: / ;
  • остаток от деления: % ;
  • возведение в степень: ** ;
  • увеличение значения переменной на 1: ++ ;
  • уменьшение значения переменной на 1: — .

Операторы ++ и — можно располагать как перед переменной, так и после неё:

Когда мы располагаем оператор ++ после переменной num , то сначала возвращается значение переменной, и только потом увеличивается её значение на 1 .

В другом случае, когда оператор ++ идёт до переменной num, то сначала увеличивается значение этой переменной на 1 , и только потом возвращается её значение.

Оператор — действует аналогично:

Кроме этого имеются комбинированные операторы: += , -= , *= , /= , %= и **= :

Для сравнения чисел в JavaScript используются следующие операторы :

  • равенство с учетом типа: === , с попыткой преобразования: == ;
  • не равенство с учетом типа: !== , с попыткой преобразования: != ;
  • больше: > , больше или равно: >= ;
  • меньше: < , меньше или равно: <= .

При сравнении чисел необходимо учитывать точность:

Способ сравнить число до двух знаков после плавающей точки:

Преобразование строки в число и наоборот

1. Преобразование строки в число

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

1.1. Использовать унарный оператор + , который необходимо расположить перед значением.

Этот способ пренебрегает пробелами в начале и конце строки, а также \n (переводом строки).

При использовании оператора + обратите внимание, что » , ‘ ‘ и ‘\n’ преобразуется в число 0 . Значение null и логические значения приводятся к следующим числам:

1.2. С помощью глобальной функции parseInt() или метода Number.parseInt() . Они предназначены для преобразования значения, переданного им на вход, в целое число . В отличие от использования унарного оператора + , эти методы позволяют преобразовать строку в число, в которой не все символы являются цифровыми . Эти методы преобразовывают строку, начиная с первого символа. И как только встречают символ, не являющийся цифровым, они останавливают дальнейший разбор строки и возвращают полученное число:

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

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

1.3. Для преобразования строки в число с плавающей точкой в JavaScript имеются методы parseFloat() и Number.parseFloat() . Друг от друга они ничем не отличаются, просто последний был добавлен в язык немного позднее:

Метод parseFloat в отличие от parseInt всегда рассматривает строку как число в десятичной системе счисления. Указать ему другую систему счисления нельзя.

2. Преобразование числа в строку.

Превратить число в строку можно с помощью метода toString() .

Дополнительно можно передать систему счисления с учётом которой необходимо явно привести число к строке:

Проверки: isFinite, isNaN, isInteger

Этот метод позволяет проверить, является ли значение конечным числом. В качестве результата isFinite возвращает true , если значение является конечным числом. В противном случае false :

Кроме Number.isFinite в JavaScript имеется также глобальная функция isFinite . Она в отличие от Number.isFinite выполняет проверку с учетом принудительное приведение переданного ей аргумента к числу:

Этот метод объекта Number предназначена для определения того, является ли значение NaN . Если это так, то isNaN возвращает true . В противном случае – false :

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

3. Как проверить, является ли значение числом?

В JavaScript имеется метод, который позволяет определить, является ли значение целым числом. Называется он isInteger :

В этом примере для ’20’ мы получили false , т.к. данное значение является строкой.

Если вам нужно проверить является ли значение числом, при это не важно целям или с плавающей точкой, то можно написать, например, вот такую функцию:

Эта функция в зависимости от результата возвращает true или false .

После этого её можно использовать для проверки следующим образом:

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

При проверке строки ’20px’ мы получили true , потому что метод parseFloat(’20px’) возвращает нам число 20 .

Округление

Округление чисел в JavaScript можно выполнить разными способами.

1. С помощью специальных, предназначенных для этой задачи, методов:

  • Math.floor – до ближайшего целого в меньшую сторону;
  • Math.ceil – до ближайшего целого в большую сторону;
  • Math.round – в большую сторону, если дробная часть >= 0.5; иначе в меньшую сторону;
  • Math.trunc – путём отбрасывания дробной части;

2. Посредством toFixed() .

Этот метод округляет дробную часть числа до заданной точности, но результат возвращает в виде строки:

3. Через toPrecision() .

Данный метод возвращает число в строковом формате, округленное с указанной точностью. При этом он может округлить целую и дробную часть числа. При этом значение может быть представлено как с плавающей точкой, так и в экспоненциальной форме:

4. С использованием логического оператора

Форматирование чисел

В JavaScript вывести число в соответствии с региональными стандартами (языковыми настройками операционной системы) позволяет метод toLocaleString() .

В соответствии с настройками установленными в системе:

Явно указав регион:

Для отображения денежных величин:

В процентном формате:

С разделением групп разрядов (свойство useGrouping ):

С указанием числа десятичных знаков:

Примеры

1. Пример, в котором напишем две функции для проверки числа соответственно на четность и не четность . А затем используем их в коде:

2. Пример на JavaScript в котором получим простые числа от 2 до 100:

3. Пример, в котором вычислим целую и дробную часть числа :

В этом примере, получение целой части числа выполняется посредством Math.floor() , а дробной части с помощью получения остатка от деления на 1 или вычитания числа от его целой части.

4. Пример, в котором определим, делится ли число нацело , используя оператор % :

Числа

Часто результатом расчётов бывает число с большим количеством знаков после запятой. Если это число будет использовано для дальнейших расчётов, то его можно оставить в таком виде. Но иногда требуется округление числа, например для вывода на страницу. В JavaScript округление чисел осуществляется несколькими методами.

Метод Math.round() округляет значение до целого числа.

Округление числа производится по математическим правилам. Если после запятой идёт цифра от 0 до 4, то дробная часть просто отбрасывается. А если после запятой идёт цифра от 5 до 9, то дробрая часть отбрасывается, а к целой части прибавляется единица. пример:

Метод toFixed() округляет число до заданной точности.

точность — количество знаков после запятой, до которого округляется число

Этот метод возвращает не число а строку. Чтобы преобразовать её в число можно добавить + к возвращаемому значению. Пример:

Есть ещё два метода, которые округляют число до целого значения. Метод Math.floor() округляет в меньшую сторону. Он отбрасывает дробную часть числа. А метод Math.ceil() округляет в большую сторону. Он отбрасывает дробную часть, а к целой части прибавляет единицу. Пример:

Случайное число

Метод Math.random() генерирует псевдо-случайное число в диапазоне от 0 до 1. При этом ровно 1 не бывает, число вегда будет меньше.

Обычно случайное число нужно получить в каком-то конкретном диапазоне. Для этого можно использовать формулу:

случайное число = минимум + Math.random() * (максимум — минимум)

Для примера выведем число в диапазоне от -2 до 5:

Конечно, 5 — (-2) это 5+2.

Не завбывайте, что число 5 Вы в этой формуле не получите. Максимальное будет 4.999999999. Полученные значения можно округлить до нужной точности.

Если нужны только целые числа, то полученные значения можно округлять до целого в меньшую сторону. К максимуму нужно прибавить единицу, чтобы этот максимум тоже был возможен. Формула получается такая:

целое число = Math.floor (минимум + Math.random() * (максимум+1 — минимум))

Выведем числа от 10 до 15:

Сравнение дробных чисел

У математических вычислений есть одна особенность — их результат не всегда абсолютно точный. Это проблема не только JavaScript, но и большинства языков программирования. Так происходит потому, что числа и другие данные переводятся в двоичный код, и только потом с ними производятся вычисления.

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

Но если при вычислении получаются два одинаковых дробных числа, то результат их сравнения не предсказуем. Они могут быть равны, либо одно может быть больше другого. Когда в скрипте используется такое сравнение, то нужно проверять, правильно ли работает скрипт. Если в нём есть ошибка, то нужно округлять значения, которые сравниваются.

Остальные математические методы

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

Метод Значение
Math.pow(x, y) Возводит x в степень y
Math.exp(x) Экспонента числа x
Math.sqrt(x) Квадратный корень из числа x
Math.log(x) Натуральный логорифм числа x
Math.abs(x) Модуль числа x
Math.max(a, b, c) Максимальное из чисел
Math.min(a, b, c) Минимальное из чисел
Math.sin(x) Синус числа x
Math.cos(x) Косинус числа x
Math.tan(x) Тангенс числа x

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

Как правильно сравнить десятичные числа в JS?

Есть ли способ сравнить decimal числа с учетом того что последнее чило у них может быть + или — 1 ?

Возможно ли такое сравнение чисел в JS и как это грамотно реализовать ?

  • Вопрос задан более трёх лет назад
  • 942 просмотра

Простой 2 комментария

  • Facebook
  • Вконтакте
  • Twitter

SagePtr

  • Facebook
  • Вконтакте
  • Twitter

SagePtr

Определяем количество знаков после запятой и разницу между числами умножаем
и округляем до целого (все эти операции, чтобы избавиться от js-ных неточностей)
Если целое не больше единицы, значит равно.

Если количество знаков после запятой определяется по первому переданному числу, то код следующий

если по числу с наибольшим количеством знаков после запятой, то такой

  • Facebook
  • Вконтакте
  • Twitter

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

Demigodd

Дмитрий,
Спасибо за подробный ответ.
Обязательно ли избавиться от js-ных точностей ?

Просто я получаю сумму неких чисел.
И делаю toFixed(10).

Тут мне и нужно такое сравнение что бы проверить такие числа.

DEATH2298, надо было этот важный момент в вопросе указать!

В этой ситуации достаточно Math.abs(sum — total) <= 1e-10
т.к. тут «ошибка округления» не зависит от последней ненулевой цифры, а заранее известна: 0.0000000001

Можно прогнать числа через .toExponential() – это их нормализует:
(123.4567).toExponential() // «1.234567e+2»
и разбить на три части: до запятой [1, 10) , после запятой и степень.
Три целых: [1, 234567, 2]

Для проверки «равенства ±1» обязательно, чтобы степень (третье число) совпала.
Разность вторых чисел — буквально вычитаем и берем Math.abs() — если равна нулю, сравниваем только первые числа — на разность не выше 1. Если первые числа равны, то разность вторых не превышать 1 должна.

С таким же преобразованием числа легко реализовать и другие операции сравнения: >= , <=

Как у дробного числа откинуть целю часть и округлить до n чисел?

Проверка результата Для проверки подставляйте разные значения переменных a, b и n и проверяйте получившийся результат. Сравнения должны давать соответствующий результат true или false в зависимости от получившихся дробных частей.

Примеры для проверки:

Критерии оценки Для любых значений a, b и n корректно вычисляются дробные части и выводятся результаты сравнения.

Ответы (5 шт):

Получить дробную часть числа можно так:

сам решил таким способом

Вычислить дробную часть числа можно отняв от этого числа его целую часть. Округлить результат до определённого количества знаков после запятой можно с помощью метода toFixed() и в скобках нужное количество знаков после запятой.

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

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