Работая над проектом, я наткнулся на JS-скрипт, созданный бывшим сотрудником, который по сути создает отчет в виде
Name : Value
Name2 : Value2
и т.п.
Проблема в том, что значения иногда могут быть числами с плавающей запятой (с разной точностью), целыми числами или даже в форме 2.20011E+17. Я хочу вывести чистые целые числа. Но я плохо разбираюсь в JavaScript. Как мне написать метод, который принимает эти числа с плавающей запятой и делает их целыми числами?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать Math.round () для округления чисел до ближайшего целого числа.
Math.round(532.24) => 532
Кроме того, вы можете использовать parseInt () и parseFloat () для приведения переменной к определенному типу, в данном случае целочисленному или с плавающей запятой.
Итак, Math.round (532.24,0) = 532?
Math.round () не имеет второго аргумента, поскольку округляет число до ближайшего целого.
Согласно Спецификация ECMAScript, числа в JavaScript представлены только 64-битным форматом двойной точности IEEE 754. Следовательно, на самом деле в JavaScript нет целочисленного типа.
Что касается округления этих чисел, есть несколько способов добиться этого. Объект Математика предоставляет нам три метода округления, которые мы можем использовать:
Math.round () используется чаще всего, он возвращает значение, округленное до ближайшего целого числа. Затем есть Math.floor (), который возвращает наибольшее целое число, меньшее или равное числу. Наконец, у нас есть функция Math.ceil (), которая возвращает наименьшее целое число, большее или равное числу.
Существует также toFixed (), который возвращает строку, представляющую число с использованием записи с фиксированной точкой.
Ps .: В методе Math.round () есть нет второго аргумента. toFixed () - это не специфично для IE, его в пределах - это также спецификация ECMAScript.
Хорошее объяснение и мое плохое за второй аргумент; Я отредактирую свой ответ, чтобы отразить это.
Вам просто нужно обратиться к спецификации =]
Вам нужно преобразовать введенные вами данные в число, а затем округлить их:
function toInteger(number){
return Math.round( // round to nearest integer
Number(number) // type cast your input
);
};
Или как один лайнер:
function toInt(n){ return Math.round(Number(n)); };
Тестирование с разными значениями:
toInteger(2.5); // 3
toInteger(1000); // 1000
toInteger("12345.12345"); // 12345
toInteger("2.20011E+17"); // 220011000000000000
Один вкладыш точно такой же, как и 4 вкладыша :)
Фактически однострочник - «Math.round (number)». Целый бизнес по литью типов не нужен. В JavaScript строки при необходимости автоматически переводятся в числа.
@AaronAsAChimp Я не могу согласиться - если строка включает символы, отличные от цифр и . или E+, то Math.round вернет NaN.
Напротив, функция Number использует тот же алгоритм преобразования чисел, что и принуждение. Алгоритм (определенный в разделе 9.3.1 3-го издания ECMA-262) обрабатывает большое количество форматов. В основном все, что было бы допустимым числом, включая десятичные дроби, обозначения экспоненты и шестнадцатеричные числа. (серьезно '0xFF' == 255)
Если вам нужно округлить до определенного количества цифр, используйте следующую функцию
function roundNumber(number, digits) {
var multiple = Math.pow(10, digits);
var rndedNum = Math.round(number * multiple) / multiple;
return rndedNum;
}
Обратите внимание, что toFixed () выводит строку. (0.1 + 0.2).toFixed(2) возвращает строку «0,30». Но вы можете вернуть его в число, добавив "+". +(0.1 + 0.2).toFixed(2) дает число 0,3
если вы используете lodash, вы можете круглая функция lodash: _.round(number, precision)
На самом деле я думаю, что то, что предлагает @qwertz, - лучший ответ, который вы можете получить на SO.
Вот способ использования Math.round() со вторым аргументом (количество десятичных знаков для округления):
// 'improve' Math.round() to support a second argument
var _round = Math.round;
Math.round = function(number, decimals /* optional, default 0 */)
{
if (arguments.length == 1)
return _round(number);
var multiplier = Math.pow(10, decimals);
return _round(number * multiplier) / multiplier;
}
// examples
Math.round('123.4567', 2); // => 123.46
Math.round('123.4567'); // => 123
Вы также можете использовать toFixed(x) или toPrecision(x), где Икс - количество цифр.
Оба эти метода поддерживаются во всех основных браузерах.
Очень хорошее приближение для округления:
function Rounding (number, precision){
var newNumber;
var sNumber = number.toString();
var increase = precision + sNumber.length - sNumber.indexOf('.') + 1;
if (number < 0)
newNumber = (number - 5 * Math.pow(10,-increase));
else
newNumber = (number + 5 * Math.pow(10,-increase));
var multiple = Math.pow(10,precision);
return Math.round(newNumber * multiple)/multiple;
}
Только в некоторых случаях, когда длина десятичной части числа очень велика, оно будет неверным.
Math.floor (19.5) = 19 также должен работать.
Этаж! = Круглый. floor(19.5) == 19, но round(19.5) = 20.
Я также рекомендую вызвать Math.floor () раньше, чтобы он не округлялся, если это то, что вы ищете.