Домой / Разное / Js целая часть от деления. Методы округления чисел в JavaScript. Округление до ближайшего числа

Js целая часть от деления. Методы округления чисел в JavaScript. Округление до ближайшего числа

Это позволяет исправить ответ @ MarkElliot, чтобы он работал и для отрицательных чисел:

Var div = Math.trunc(y/x); var rem = y % x;

Обратите внимание, что методы Math имеют преимущество перед побитовыми операторами, что они работают с числами более 2 31 .

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

FLOOR определяется как «наибольшее целое число, меньшее, чем параметр», таким образом:

  • положительные числа: FLOOR (X) = целая часть X;
  • отрицательные числа: FLOOR (X) = целая часть X минус 1 (потому что она должна быть SMALLER, чем параметр, т. е. более отрицательный!)

REMAINDER определяется как «оставшееся» деления (евклидова арифметика). Когда дивиденд не является целым числом, фактор обычно также не является целым числом, т. Е. Нет остатка, но если фактор вынужден быть целым числом (и это то, что происходит, когда кто-то пытается получить остаток или модуль число с плавающей запятой), очевидно, будет нецелое «оставленное».

JavaScript вычисляет все так, как ожидалось, поэтому программист должен быть осторожным, чтобы задавать правильные вопросы (и люди должны быть осторожны, чтобы ответить на то, что задано!) Первый вопрос Ярина был НЕ «что такое целочисленное деление X на Y», вместо этого: «Целое число раз, когда данное целое число ИДЕТ В другое». Для положительных чисел ответ один и тот же для обоих, но не для отрицательных чисел, потому что целочисленное деление (дивиденд на делитель) будет -1 меньше, чем число (делитель) «переходит в другое» (дивиденд). Другими словами, FLOOR вернет правильный ответ для целочисленного деления отрицательного числа, но Ярин не спросил об этом!

gammax правильно ответил, этот код работает по заданию Ярина. С другой стороны, Самуил ошибается, он не делал математики, я думаю, или он бы видел, что это действительно работает (также он не сказал, что было делителем его примера, но я надеюсь, что это было 3):

Остаток = X% Y = -100% 3 = -1

GoesInto = (X - Remainder) / Y = (-100 - -1) / 3 = -99 / 3 = -33

Кстати, я тестировал код на Firefox 27.0.1, он работал, как ожидалось, с положительными и отрицательными числами, а также с нецелыми значениями, как для дивидендов, так и для делителей. Пример:

100.34 / 3.57: GoesInto = -28, Remainder = -0.3800000000000079

Да, я заметил, что там есть проблема с высокой точностью, но я не успел ее проверить (я не знаю, есть ли проблема с Firefox, Windows 7 или с FPU моего процессора). Однако для вопроса Ярина, который включает только целые числа, код гаммакса работает отлично.

Вы можете использовать функцию parseInt для получения усеченного результата.

ParseInt(a/b)

Чтобы получить остаток, используйте оператор mod:

parseInt имеют некоторые подводные камни со строками, чтобы избежать использования параметра radix с базой 10

ParseInt("09", 10)

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

ParseInt(100000000000000000000000000000000, 10) // 1e+32

Этот вызов даст результат 1.

Вычисление количества страниц может быть выполнено за один шаг: Math.ceil (x / y)

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

Export function divideBy2(num) { return ; } export function divideBy4(num) { return ; } export function divideBy8(num) { return ; }

(Первое - это частное, второе - остальное)

Это всегда будет усекать к нулю. Не уверен, что уже слишком поздно, но здесь говорится:

Function intdiv(dividend, divisor) { divisor = divisor - divisor % 1; if (divisor == 0) throw new Error("division by zero"); dividend = dividend - dividend % 1; var rem = dividend % divisor; return { remainder: rem, quotient: (dividend - rem) / divisor }; }

Я не эксперт в побитовых операторах, но вот еще один способ получить целое число:

Var num = ~~(a / b);

Это будет нормально работать и для отрицательных чисел, в то время как Math.floor() будет вращаться в неправильном направлении.

Это тоже кажется правильным:

Var num = (a / b) >> 0;

Math.floor(operation) возвращает округленное значение операции.

Пример 1- го вопроса:

Var x = 5; var y = 10.4; var z = Math.floor(x + y); console.log(z);

Приставка:

Пример 2- го вопроса:

Var x = 14; var y = 5; var z = Math.floor(x%y); console.log(x);

Приставка:

Для некоторого числа y и некоторого дивизора x вычислить фактор (quotient) и остаток (remainder) как:

Var quotient = Math.floor(y/x); var remainder = y % x;

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

Функция isFinite

Функция isFinite позволяет проверить, является ли аргумент конечным числом.

В качестве ответа данная функция возвращает false , если аргумент является Infinity , -Infinity , NaN или будет быть приведён к одному из этих специальных числовых значений. В противном случае данная функция вернёт значение true .

IsFinite(73); // true isFinite(-1/0); // false isFinite(Infinity); // false isFinite(NaN); // false isFinite("Текст"); // false

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

IsFinite("73"); // true Number.isFinite("73"); // false

Функция isNaN

Функция isNaN предназначена для определения того, является ли аргумент числом или может ли быть преобразован к нему. Если это так, то функция isNaN возвращает false. В противном случае она возвращает true.

IsNaN(NaN); //true isNaN("25px"); //true, т.к. 20px - это не число isNaN(25.5); //false isNaN("25.5"); //false isNaN(" "); //false, т.к. пробел или неcколько пробелов преобразуется к 0 isNaN(null); //false, т.к. значение null преобразуется к 0 isNaN(true); //false, т.к. значение true преобразуется к 1 isNaN(false); //false, т.к. значение false преобразуется к 0

Если это действие нужно выполнить без приведения типа, то используйте метод Number.isNaN . Данный метод был введён в язык, начиная с ECMAScript 6.

Как явно преобразовать строку в число?

Явно привести строку в число можно посредством следующих способов:

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

+"7.35"; // 7.35 +"текст"; // NaN

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

+" 7.35 "; //7.35 +"7.35 \n "; //7.35

Используя данный способ необходимо обратить внимание на то, что пустая строка или строка, состоящая из пробелов и \n , переводится в число 0. Кроме этого она также преобразует тип данных null и логические значения к числу.

Null; //0 +true; //1 +false; //0 +" "; //0

2. Функция parseInt . Данная функция предназначена для преобразования аргумента в целое число . В отличие от использования унарного оператора + , данный метод позволяет преобразовать строку в число, в которой не все символы являются цифровыми . Начинает она преобразовывать строку, начиная с первого символа. И как только она встречает символ, не являющийся цифровым, данная функция останавливает свою работу и возвращает полученное число.

ParseInt("18px"); //18 parseInt("33.3%"); //33

Данная функция может работать с разными системами счисления (двоичной, восьмеричной, десятичной, шестнадцатеричной). Указание основание системы счисления осуществляется посредством 2 аргумента.

ParseInt("18px", 10); //18 parseInt("33.3%", 10); //33 parseInt("101",2); //5 parseInt("B5",16); //181

Кроме функции parseInt в JavaScript имеется метод Number.parseInt . Данный метод ничем не отличается от функции parseInt и был введён в JavaScript со спецификацией ECMASCRIPT 2015 (6).

3. Функция parseFloat . Функция parseFloat аналогична parseInt , за исключением того что позволяет выполнить преобразование аргумента в дробное число.

ParseFloat("33.3%"); //33.3

Кроме этого функция parseFloat в отличие от parseInt не имеет 2 аргумента, и следовательно она всегда пытается рассмотреть строку как число в десятичной системе счисления.

ParseFloat("3.14"); parseFloat("314e-2"); parseFloat("0.0314E+2");

Кроме функции parseFloat в JavaScript имеется метод Number.parseFloat . Данный метод ничем не отличается от функции parseFloat и был введён в JavaScript со спецификацией ECMASCRIPT 2015 (6).

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

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

(12.8).toString(); //"12.8"

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

(255).toString(16); //"ff"

Как проверить является ли переменная числом

Определить является ли значение переменной числом можно используя один из следующих способов:

1. С использованием функций isNaN и isFinite:

// myVar - переменная if (!isNaN(parseFloat(myVar)) && isFinite(parseFloat(myVar))) { //myVar - это число или может быть приведено к нему };

В виде функции:

// функция function isNumeric(value) { return !isNaN(parseFloat(value)) && isFinite(parseFloat(value)); } // использование var myVar = "12px"; console.log(isNumeric(myVar)); //true

Этот способ позволяет определить является ли указанное значение числом или может быть приведено к нему. Данный вариант не считает числом пустую строку, строку из пробелов, значение null , Infinity , -Infinity , true и false .

2. С использованием оператора typeof и функций isFinite, isNaN:

// функция которая проверяет является ли значение числом function isNumber(value) { return typeof value === "number" && isFinite(value) && !isNaN(value); }; // использование функции isNumber isNumber(18); //true // использование функций для проверки текстовых значений isNumber(parseFloat("")); //false isNumber(parseFloat("Infinity")); //false isNumber(parseFloat("12px")); //true

Эта функция определяет имеет ли указанное значение тип Number, а также не принадлежит ли оно к одному из специальных значений Infinity, -Infinity и NaN. Эсли это так, то данная функция возвращает значение true.

3. С помощью метода ECMAScript 6 Number.isInteger(value) . Данный метод позволяет определить, является ли указанное значение целым числом.

Number.isInteger("20"); //false, т.к. данный метод не выполняет перевод строки в число Number.isInteger(20); //true, т.к. данное значение является числом

Чётные и нечётные числа

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

// Функция для проверки числа на чётность function isEven(n) { return n % 2 == 0; } // Функция для проверки числа на нечётность function isOdd(n) { return Math.abs(n % 2) == 1; }

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

Value = 20; if (Number.isInteger(value)) { if (isEven(value)) { console.log("Число " + value.toString() + " - чётное"); } }

Простые числа в Javascript

Рассмотрим пример в котором выведем с помощью Javascript простые числа от 2 до 100.

// Функция, которая проверяет является ли число простым function isPrime(value) { if (isNaN(value) || !isFinite(value) || value%1 || value < 2) return false; var max=Math.floor(Math.sqrt(value)); for (var i = 2; i< = max; i++) { if (value%i==0) { return false; } } return true; } // создать массив, который будет содержать простые числа от 2 до 100 var primaryNumber = ; for (var i = 2; i <= 100; i++) { if(isPrime(i)) primaryNumber.push(i); } // вывести в консоль простые числа от 2 до 100 console.log(primaryNumber);

Округление числа в Javascript

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

1. Используя специально предназначенные для этого методы Math.floor , Math.ceil и Math.round . Метод Math.floor округляет дробное число до ближайшего целого вниз, т.е. попросту отбрасывает дробную часть. Math.ceil скругляет дробное число до ближайшего целого вверх. Math.round округляет число вверх или вниз в зависимости от значения дробной части. Если дробная часть больше или равно 0.5, то вверх, иначе скруление осуществляется вниз.

Console.log(Math.floor(7.9)); //7 console.log(Math.ceil(7.2)); //8 console.log(Math.round(7.5)); //8

2. С помощью метода toFixed(точность) . Данный метод округляет дробную часть числа до заданной точности. Результат округления возвращает в виде строки.

Console.log(7.987.toFixed(2)); //"7.99"

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

Console.log(7.987.toFixed(5)); //"7.98700"

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

Console.log((1001).toPrecision(2)); //"1.0e+3" console.log((1001).toPrecision(5)); //"1001.0" console.log((12.4).toPrecision(1)); //"1e+1" console.log((12.4).toPrecision(2)); //"12" console.log((12.4).toPrecision(3)); //"12.4" console.log((12.4).toPrecision(5)); //"12.400"

4. Используя логические операторы НЕ или ИЛИ.

//посредством двойного логического отрицания console.log(~~7.9); //7 // посредством использования логического ИЛИ с нулём: console.log(7.9^0); //7

Целая и дробная часть числа

Получить целую часть числа можно используя метод Math.floor() и parseInt() :

Console.log(Math.floor(7.21)); // 7 console.log(parseInt(7.21)); // 7

Получить дробную часть числа можно воспользовавшимся оператором процент (%). Данный оператор возвращает остаток, который будет получен от деления первого числа на второе. В данном случае в качестве 2 числа необходимо использовать 1.

Console.log(7.21%1); // 0.20999999999999996 // с точностью до 2 знаков после запятой console.log((7.21%1).toFixed(2)); // "0.21"

Кроме этого дробную часть можно получить также с помощью вычислений:

Var number = 7.21; var fractionNumber = number - Math.floor(Math.abs(number)); console.log(fractionNumber); // 0.20999999999999996

Делится ли число нацело

Определить делится ли число нацело можно используя оператор процента:

Var number = 9; // если остаток от деления числа number на 3 равен 0, то да, иначе нет if (number%3==0) { console.log ("Число " + number + " делится на 3"); } else { console.log ("Число " + number + " не делится на 3"); }

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

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

Например, выполним форматирование числа в соответствии с региональными стандартами, которые установлены в системе по умолчанию:

Var number = 345.46; console.log(number.toLocaleString()); //"345,46"

Например, выполним форматирование числа в соответствии с региональными стандартами России (ru):

Console.log((108.1).toLocaleString("ru-RU")); //"108,1"

Данный метод можно также использовать для форматирования числа в виде валюты:

Console.log((2540.125).toLocaleString("ru-RU",{style:"currency", currency:"RUB"})); //"2 540,13 ₽" console.log((89.3).toLocaleString("ru-RU",{style:"currency", currency:"USD"})); //"89,30 $" console.log((2301.99).toLocaleString("ru-RU",{style:"currency", currency:"EUR"})); //"2 301,99 €"

Представление числа в виде процентов:

Console.log((0.45).toLocaleString("ru-RU",{style:"percent"})); //"45 %"

Разбить число на разряды (свойство useGrouping):

Console.log((125452.32).toLocaleString("ru-RU",{useGrouping:true})); //"125 452,32"

Вывести с число с определённым количеством цифр (2) после запятой:

Console.log((1240.4564).toLocaleString("ru-RU",{minimumFractionDigits:2, maximumFractionDigits:2})); //"1 240,46"

Сравнение чисел

Для сравнения чисел в JavaScript используются следующие операторы: == (равно), != (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).

Например, сравним два числа:

Console.log(2>3); //false console.log(5>=3); //true

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

Например, в JavaScript сумма чисел (0.2 + 0.4) не равна 0.6:

Console.log((0.2+0.4)==0.6); //false

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

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

0.125 × 2 = 0.25 | 0 0.25 × 2 = 0.5 | 0 0.5 × 2 = 1 | 1 0.125 10 = 0.001 2

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

0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 0.2 × 2 = 0.4 | 0 0.4 × 2 = 0.8 | 0 0.8 × 2 = 1.6 | 1 0.6 × 2 = 1.2 | 1 ... 0.2 10 = 0.001100110011... 2

В результате эти погрешности скажутся при вычисления суммы двух чисел и результатах сравнения. Т.е. получится что на самом деле JavaScript будет видет эту запись следующим образом:

0.6000000000000001==0.6

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

Например, сравнить числа до 2 знаков после запятой используя методы toFixed() и toPrecision() :

//метод toFixed() console.log((0.2+0.4).toFixed(2)==(0.6).toFixed(2)); //true //метод toPrecision() console.log((0.2+0.4).toPrecision(2)==(0.6).toPrecision(2)); //true

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

В JavaScript существуют следующие математические операторы: + (сложение), - (вычитание), * (умножение), / (деление), % (остаток от деления), ++ (увелить значение на 1), -- (уменьшить значение на 1).

6+3 //9 6-3 //3 6*3 //18 6/3 //2 6%3 //0, т.е. 6:3=2 => 6-3*2 => ост(0) 5%2 //1, т.е. 5:2=2(.5) => 5-2*2 => ост(1) 7.3%2 //1.3, т.е. 7.3:2=3(.65) => 7.3-2*3 => ост(1.3) //знак результата операции % равен знаку первого значения -9%2.5 //-1.5, т.е. 9:2.5=3(.6) => 9-2.5*3 => ост(1.5) -9%-2.5 //-1.5, т.е. 9:2.5=3(.6) => 9-2.5*3 => ост(1.5) -2%5 //-2, т.е. 2:5=0(.4) => 2-5*0 => ост(2) x = 3; console.log(x++); //выводит 3, у уже потом устанавливает 4 console.log(x); //4 x = 3; console.log(++x); //устанавливает 4 и выводит x = 5; console.log(x--); //выводит 5, у уже потом устанавливает 4 console.log(x); //4 x = 5; console.log(--x); //устанавливает 4 и выводит Кроме этого в JavaScript есть комбинированные операторы: x+=y (x=x+y), x-=y (x=x-y), x*=y (x=x*y), x/=y (x=x/y), x%=y (x=x%y). x = 3; y = 6; x+=y; console.log(x); //9 x = 3; y = 6; x-=y; console.log(x); //-3 x = 3; y = 6; x*=y; console.log(x); //18 x = 3; y = 6; x/=y; console.log(x); //0.5 x = 3; y = 6; x%=y; console.log(x); //3


В этой части наших занятий мы познакомимся с объектом Number как с контейнером числового типа данных. Его собственно объектная сущность сегодня будет затронута очень поверхностно.

Так же, как объект String содержит строки текста, объект Number содержит числа. Так же, как и строки, числа, которые мы создаём, атоматически становятся экземплярами объекта.

Тип данных Number

Числа в JavaScript бывают двух видов: целые и с плавающей точкой (разделений на множество типов, как в других языках — integer, long, short, double — здесь нет). Числа с плавающей точкой имеют целую и дробную части, разделённые точкой (независимо от национальных настроек).

Эти два вида чисел не являются самостоятельными типами и не нуждаются в специальной конверсии между собой. Если, например, 32.5 мы умножим на 0.4 , то сразу получим целое число 13 , а не дробь 13.0 , которую нужно конвертировать в целочисленное значение (как сплошь и рядом в других языках).

Создание объекта Number

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

var myNum = 21 ;

Но можно создать и новый объект с помощью конструктора:

var myNum = new Number ; myNum = 21 ;

В подавляющем большинстве случаев это излишне и даже вредно. Корректные примеры подобной работы с объектами мы рассмотрим в 4-й части.

Представление чисел

Экспоненциальная форма

Числа можно представлять как в обычной, так и в экспоненциальной форме, например:

2e6 // без пробелов!

Это означает: 2 × 10 6

Если мы выведем такое число через метод документа write() , то получим развёрнутое число в обычном представлении.

Document.write (14e12 );

Результат:

Основные системы счисления

Числа можно также представлять как в десятичной, так в шестнадцатеричной и восьмеричной системах.

Целые числа в десятичной форме не должны начинаться с нуля , потому что нуль является префиксом для недесятичных систем. Просто 0 — префикс для восьмеричных значений, а 0x — для шестнадцатеричных.

Например, 075 — это восьмеричное представление десятичного числа 61 , а 0x75 — шестнадцатеричное представление десятичного числа 117 .

Для восьмеричных значений используются цифры от 0 до 7 , для шестнадцатеричных — цифро-буквенный ряд 0123456789ABCDEF . Буквы можно использовать в любом регистре .

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

Представление чисел в других системах

Говоря об объекте String , мы касались метода toString() , который конвертирует любой объект в строку. При конвертации чисел в строки желательно указать как аргумент систему счисления.

Обратите внимание

Исходное число требуется заключить в скобки

(число).toString (система)

система — может принимать любые значения от 2 до 36.

(157 ).toString (2 ); // двоичное представдение 157, равно (53 ).toString (27 ); // экзотическое 27-ричное представдение 53, равно

Но эти полученные выражения являются строками. Чтобы сделать их реальными числами в указанных системах счисления, нужно результат метода toString(система) конвертировать обратно в число. Делается это уже не методом, а функцией ядра Number(объект) . О функциях ядра мы поговорим в одном из ближайших уроков, а пока обратите внимание на синтаксис, он похож на вызов функции:

var a = 1546 ; var b = a.toString (2 ); var c = Number (b);

Или сразу, «два в одном»:

var a = 1546 ; var b = Number (a.toString (2 ));

Примечание

Если исходное число назначено на переменную, то её не надо брать в скобки при вызове метода toString() .

Свойства объекта Number

Общие объектные свойства constructor и prototype мы затронем в уроке об объекте Object , а сейчас обратимся к специфическим свойствам объекта Number .

Эти свойства — только для чтения , то есть мы не можем их изменять.

MAX_VALUE

Максимальное число, доступное для обработки в JavaScript.

Посмотрим, что же это за число такое:

var e = Number .MAX_VALUE document.write (e)

Результат:

1.7976931348623157e+308

Плюс в данном случае — не знак сложения, а положительная степень, то есть 1.7976931348623157 × 10 308

Примечание

Обычно я демонстрирую результаты с помощью реально написанных скриптов. Но слишком много вычислений дробных чисел могут тормозить загрузку страницы, и большинство результатов в этом уроке написаны, так сказать, «от руки».

MIN_VALUE

А это — соответственно — минимальное значение. Исследуем его.

var f = Number .MIN_VALUE document.write (f)

Результат:

То есть 5 × 10 -324

Нечисловое значение, с которым мы уже встречались.

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

NEGATIVE_INFINITY, POSITIVE_INFINITY

Когда-то считали примерно так: «один оленя, два оленя, много оленя».

JavaScript считает чуть более «продвинуто»: «один оленя, два оленя, три оленя, ... , 1.7976931348623157 × 10 308 оленя, много оленя».

Это запредельное «много» выражается свойством POSITIVE_INFINITY .

При обратном процессе — делении единицы («одного оленя») на мелкие-мелкие кусочки — самым мелким считанным кусочком окажется 5 × 10 -324 часть. Всё, что меньше, — это уже NEGATIVE_INFINITY .

Методы объекта Number

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

toExponential()

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

Синтаксис:

число.toExponential (количествоЗнаков )

Аргумент количествоЗнаков задаёт точность округления после десятичной точки. Если аргумент опущен, количество цифр после десятичной точки равно количеству цифр, необходимых для представления значения.

Пример:

var myFullNumber = 4659872156831598853654127 ; document.write (myFullNumber.toExponential(4))

Результат:

toFixed()

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

Синтаксис:

число.toFixed (количествоЗнаков )

Примеры:

var myDecimal1 = 46.59872156831598853654127 ; var myDecimal2 = 46 ; document.write (myDecimal1.toFixed(1)) document.write ("
") document.write (myDecimal2.toFixed(3))

Результаты:

Этот метод иногда бывает очень полезен. Например, громоздкую функцию из прошлого урока можно теперь представить так:

function anyRootPlus(x, y) { var srcnum = Math .exp (Math .log (x) / y); var result = (srcnum).toFixed (3); return result; }

А теперь вставим её в форму и протестируем:

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

toLocaleString()

Преобразует числовой объект в строковое значение с учётом национальных настроек для десятичных разделителей и разделителей между тысячами. За основу берётся национальная валюта, поэтому в русском варианте все, даже целые, числа представлены с двумя знаками после запятой (копейками):

var myDrob = 25.327 ; var myMnogo = 25635120 ; var myRoubl = 35 ; /* сделаем покрупнее, чтобы лучше разглядеть запятые */ document.write ("

" + myDrob.toLocaleString () + "

" ); document.write ("

" + myMnogo.toLocaleString () + "

" ); document.write ("

" + myRoubl.toLocaleString () + "

" );

Результаты:

toPrecision()

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

Синтаксис:

число.toPrecision (количЦифр )

Аргумент:

количЦифр — количество цифр в отображаемой строке. Если заданное количество больше количества в исходном числе, отображаются десятичные нули.

Document.write ((354 ).toPrecision (8 ))

Результат:

Методы toPrecision() и toLocaleString() совместно не работают , для «русского дизайна» чисел любой точности потребуется написать собственную функцию. Написанную функцию можно сделать дополнительным методом объекта Number , нечто подобное мы уже делали с объектом Date() . Подробнее — в уроке об объекте Object .

toString()

Ну, этот метод мы уже подробно разобрали в начале урока.

Создаём собственный метод

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

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

Объявим метод:

Number.prototype.toRussianString = toRussianString

Прежде чем приступим к построению функции, сформулируем задачи.

Сначала нам нужно представить число как строку и извлечь из него целую часть, дробную часть и точку-разделитель.

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

Начнём функцию с объявления нужных переменных.

function toRussianString(prec) { /* переменные для преобразования строк */ var a = "" , b = "" , c, d, e;

Забегая вперёд, скажу, что десятичная часть в результате наших строковых пертурбаций утрачивает свою «дробную» сущность, и работать с ней предстоит как с ещё одним целым числом. Для работы с ней воспользуемся методом toPrecision() , и аргумент нашей функции (а заодно и нашего метода) задаёт значение именно для метода toPrecision() . Минимальный параметр этого метода — единица. А для нашей функции может понадобиться и ноль (при округлении до целого числа). И при этом правильное округление должно сработать ещё до того, как мы начнём «расчленять» объект. Поэтому сразу же при объявлении переменных обойдём этот подводный камень:

/* переменная, конвертирующая в строку заданный экземпляр объекта */ if (prec == 0 ) var str = this .toFixed (0 ).toString toString (10 );

Продолжаем объявление переменных.

/* переменная для возвращаемого значения */ var nr1; /* переменные для частей «расчленёнки» */ var intpart, fractpaft, precpart, divider, dot = str.lastIndexOf ("." ); /* счётчик */ var i;

Переменная dot находит позицию точки в строке указанного числа. По этой позиции отсекаем целую часть (intpart ). Если число целое и точки нет, её позиция будет меньше нуля. В этом случае и разделитель (divider ), и дробная часть (fractpart ) должны быть пустыми строками. В противном случае на разделитель назначается запятая, а дробная часть отсекается для дальнейшей работы:

if (dot < 0 ) { intpart = str; fractpart = "" ; divider = "" ;} else { intpart = str.substring (0 , dot); fractpart = str.substring (dot + 1 , str.length ); divider = "," ;}

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

if (intpart.length > 3 ) {

Теперь разложим следующий «пасьянс» (всё это происходит внутри условного оператора):

Пройдём циклом по тройкам в обратном порядке.

Сначала соберём их в переменную a безо всяких добавлений, просто для того, чтобы вычислить длину образовавшейся подстроки. Ведь если общее количество цифр не делилось на 3, то слева остался хвостик из 1 или 2 цифр, и теперь мы можем выразить и его в виде подстроки, отняв от длины всей строки длину подстроки с «тройками» (переменная c ). И поставим перед ним неразрывный пробел — (который потом будем убирать). Зачем? Поскольку группы из трёх цифр считывались в обратном порядке, этот начальный хвостик нужно поместить в конец ряда. То есть, если у нас было число, допустим, 36748521, нам нужно выстроить 521 748 36, ставя перед каждой группой неразрывный пробел, чтобы был разделитель для массива (ведь нам же надо перевернуть их обратно, а это можно сделать с помощью метода массива reverse() ).

В последней инструкции цикла мы расставим в тройках и запишем результат в переменную b .

for (i=intpart.length -3 ; i>=0 ; i-=3 ) /* собираем тройки */ { a = a + intpart.substr (i, 3 ); /* находим левый "хвостик" */ c = " " + intpart.substr (0 , intpart.length -a.length ); /* расставляем в тройках разделители */ b = b + " " + intpart.substr (i, 3 );}

При сложении строк b + c мы получаем строку, которую нужно преобразовать в массив, а затем этот массив перевернуть и снова конвертировать в строку (это всё записывается в переменную d ).

D = (b+c).split (" " ).reverse ().toString ().replace (/,/g, " " );

Массив преобразуется в строку вместе с запятыми-разделителями, они нам не нужны. Поэтому в этой же инструкции удаляем их с помощью регулярного выражения /,/g , где /,/ — создание регулярного выражения для запятой, а g — «флажок», который показывает, что нужно заменить все образцы выражения (попросту говоря — все запятые), которые встретятся в строке. Заменяем их на всё те же неразрывные пробелы.

(Подробно о регулярных выражениях будет рассказано в последней части пособия.)

А теперь нужно кое-что ещё почистить (внутри того же условного оператора if (intpart.length > 3) ).

Дело в том, что либо в начале, либо в конце нашей строки окажется лишний неразрывный пробел, состоящий из 6 символов: «&», «n», «b», «s», «p» и «;». Поэтому очистим мусор и запишем результат в переменную e :

if (d.substring (0 , 1 ) == "&" ) e = d.substring (6 , d.length -6 ); else e = d.substring (0 , d.length -6 );

Вот теперь мы можем с чистой совестью закрыть весь условный оператор и написать альтернативный вариант для короткого числа, которое не нужно разбивать на «тройки».

} else e = intpart;

Итак, переменная e хранит целую часть числа, а мы займёмся десятичной.

Внимание! Когда мы работаем с дробной частью (с которой теперь нужно обращаться как с целой), мы должны помнить, что при prec == 0 функция «заартачится», поэтому сразу «забьём заглушку»:

if (prec != 0 ) {

Теперь можно работать спокойно. Но есть ещё несколько «камешков», которые мы сейчас обойдём.

Во-первых, если дробная часть у нас, предположим, 41 , а мы задаём округление до 3 знаков, то метод toPrecision , принимая нашу дробную часть за целое число, выведет 41.0 , то есть надо убирать точку.

Во-вторых, если дробная часть исходного числа окажется больше 3 знаков, то метод toPrecision начнёт выдавать результат в экспоненциальной форме. С этим тоже придётся побороться.

Поэтому мы будем «чистить» результат через три переменных: precpart , precpart1 и precpart2 .

Precpart = (Number (fractpart).toPrecision (prec)).toString (10 )

Теперь «чистим»:

/* если дробная часть есть */ if (fractpart != "") { /* ищем и устраняем точку */ precpart1 = precpart.replace (".", "") /* проаеряем, нет ли там экспоненты, */ var plus = precpart1.lastIndexOf("e"); /* и если она есть, */ if (plus > 0 ) /* выдёргиваем с корнем, */ precpart2 = precpart1.substring (0 , plus); /* в противном случае */ else /* ничего не меняем */ precpart2 = precpart1 } /* если дробной части нет, */ else /* то выводим нули и опять же избавляемся от точки */ precpart2 = "," + precpart.replace ("." , "" )

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

} else { /* то есть если всё-таки prec равна нулю, просто выводим пустые строки */ precpart2 = "" ; divider = "" ; }

И финальный аккорд:

Nr1 = e + divider + precpart2; return nr1; }

Вся функция целиком:

function toRussianString(prec) { var a = "" , b = "" , c, d, e; if (prec == 0 ) var str = this .toFixed (0 ).toString (10 ); else var str = this .toString (10 ); var nr1; var intpart, fractpaft, precpart, divider, dot = str.lastIndexOf ("." ); var i; if (dot < 0 ) { intpart = str; fractpart = "" ; divider = "" ;} else { intpart = str.substring (0 , dot); fractpart = str.substring (dot + 1 , str.length ); divider = "," ;} if (intpart.length > 3 ) { for (i=intpart.length -3 ; i>=0 ; i-=3 ) { a = a + intpart.substr (i, 3 ); c = " " + intpart.substr (0 , intpart.length -a.length ); b = b + " " + intpart.substr (i, 3 );} d = (b+c).split (" " ).reverse ().toString ().replace (/,/g, " " ); if (d.substring (0 , 1 ) == "&" ) e = d.substring (6 , d.length -6 ); else e = d.substring (0 , d.length -6 ); } else e = intpart; if (prec != 0 ) { precpart = (Number (fractpart).toPrecision (prec)).toString (10 ) if (fractpart != "") { precpart1 = precpart.replace (".", "") var plus = precpart1.lastIndexOf("e"); if (plus > 0 ) precpart2 = precpart1.substring (0 , plus); else precpart2 = precpart1 } else precpart2 = "," + precpart.replace ("." , "" ) } else { precpart2 = "" ; divider = "" ; } nr1 = e + divider + precpart2; return nr1; }

Теперь эту функцию можно вызывать как метод.

Var myNumber = 2569843359.6583521 document.write (myNumber.toRussianString (3 ))

Результат:

Можете поместить конструктор метода и функцию в библиотеку — то есть в файл.js, который можно вызывать из кода web-страниц. По мере написания методов к разным объектам можно рассортировать методы по библиотечным файлам для этих объектов и пользоваться дополнительными методами.