Я хотел бы округлить до двух знаков после запятой, только когда это необходимо . Вот примеры входов и выходов
Вход:
10
1.7777777
9.1
Вылет из:
10
1.78
9.1
Как я могу сделать это в JavaScript?
Фрагмент
var valor = [
10,
1.77777777,
9.1
];
var resultado = valor.map(Math.round);
console.log(resultado);
Вопрос, вдохновленный Округлением не более чем до 2 знаков после запятой
Вы также можете использовать метод toFixed() , хотя он преобразует число в строку, и вам придется использовать функцию Number() :
Недостатком является то, что он оставляет 0, если число не содержит десятичных знаков или меньше, чем параметр, переданный toFixed(). Эта небольшая функция устраняет эту проблему:
Эти две функции соответствуют всем проведенным испытаниям.
1. Адаптировано из MDN ( рекомендуемое решение )
Взяв код из Decimal Rounding , я адаптировал решение так, чтобы оно выполняло симметричное арифметическое округление с отрицательными числами. То есть округлить -1,5 ≈ -2.
2. Использование Intl.NumberFormat()
Функция
Intl.NumberFormat([locales[, options]])
позволяет правильно округлить число с помощью собственного кода. Однако, как будет видно позже, эта функция принимает параметры, зависящие от языка, что значительно замедляет ее работу.Возвращает строку с представлением числа, округленного до максимального установленного числа десятичных знаков. Если вы хотите обратно преобразовать в число, примените
parseFloat()
к результату.Обсуждение
При манипулировании числами путем выполнения операций с плавающей запятой существует ограничение на их точное представление. JavaScript использует 64-битное представление с плавающей запятой с соответствующими ограничениями. Дополнительные сведения см. в статье Почему мои программы не могут правильно выполнять арифметические операции? .
Это означает, что существуют числа, для которых их представление создает проблемы для правильного округления . Однако методы, используемые в этом ответе, решают эти проблемы.
Кроме того, есть еще одно специфическое поведение, которого избегают: Math.round() округляет 5 в первой незначащей позиции отрицательного значения до 0 .
В следующем тесте было исправлено округление отрицательных чисел,
Math.round()
и сравниваются случаи, в которых каждое из них может дать сбой.Результаты каждого ответа:
Однако эффективность имеет свой компромисс с производительностью (см. тест ).
В заключение:
Math.round()
является самым быстрым, но оно не работает с отрицательными значениями и имеет проблемы с точностью с плавающей запятой.mathRound2()
(в этом же ответе) расширило его до общего случая и устранило ошибку с отрицательными значениями. Он по-прежнему быстрее остальных, но по-прежнему не устраняет ошибку точности .Intl.NumberFormat()
этим ответом возвращает правильный результат во всех случаях, но значительно медленнее, чем другие.round()
десятичного округления — это то, которое, пройдя все тесты, работает лучше всего . Он значительно медленнее, чемmathRound2()
, но по-прежнему выполняет 50 тыс. операций в секунду, что более чем приемлемо для многих сценариев, поэтому его рекомендуется использовать в общем случае, когда требуется точный ответ без ошибок округления.Короткий ответ
Использование
Math.round(valor * 100) / 100
Объяснение
Этот ответ включен в качестве популярного решения, однако он вносит ошибку округления, которая может быть или не быть актуальной. Чтобы углубиться в это, см. Math.round()
Фрагмент
Ответ, вдохновленный ответом на Округление не более чем до 2 знаков после запятой
Чтобы решить эту проблему, я подумал о том, чтобы преобразовать число в строку и после его обработки преобразовать обратно в число. Процесс заключается в разделении числа только тогда, когда появляется точка.
e
e-
e+
e+
Если ни один из них не существуетe-
, находит точку, разрывает текст в позиции, которая является суммой места точки и количества десятичных знаков. Это также оставляет дополнительное пространство, которое будет иметь решающее значение при приближении числа. Этот последний символ, если он равен или больше 5, увеличивается на 1, предпоследний десятичный знак.Иногда то, что вводится, имеет несколько знаков после запятой, и мы хотим выполнить аппроксимацию с большим количеством знаков после запятой, но это не проблема, так как мы можем дополнить число нулями справа и продолжить обработку в обычном режиме.
Код:
Существует множество способов округления числа, а также различные формы округления. Классическое округление (увеличение на одну единицу, когда дробная часть >= 5) может быть выполнено с помощью
Math.round
или, если округляется только дробная часть, вы можете использоватьtoFixed
.Пример
Просто, понятно, красиво и точно.
Пожалуйста, взгляните на этот простой пример и убедитесь, что это то, что вам нужно.
Вы просто умножаете на 100, делаете Math.round и делите на 100