Как округлить до 1 десятичного знака в Javascript? - PullRequest
313 голосов
/ 08 сентября 2011

Можете ли вы округлить число в javascript до 1 символа после десятичной точки (правильно округлено)?

Я пробовал * 10, раунд, / 10, но он оставляет два десятичных знака в конце int.

Ответы [ 20 ]

2 голосов
/ 08 сентября 2011

Если ваш метод не работает, пожалуйста, оставьте свой код.

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

var value = Math.round(234.567*100)/100

Даст вам 234,56

Аналогично

 var value = Math.round(234.567*10)/10

даст 234,5

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

1 голос
/ 13 февраля 2018

Как правило, округление выполняется путем масштабирования: round(num / p) * p

Использование экспоненциальной записи правильно обрабатывает округление чисел + ve.Однако этот метод не может правильно округлить все крайние случаи.

function round(num, precision = 2) {
	var scaled = Math.round(num + "e" + precision);
	return Number(scaled + "e" + -precision);
}

// testing some edge cases
console.log( round(1.005, 2) );  // 1.01 correct
console.log( round(2.175, 2) );  // 2.18 correct
console.log( round(5.015, 2) );  // 5.02 correct

console.log( round(-1.005, 2) );  // -1    wrong
console.log( round(-2.175, 2) );  // -2.17 wrong
console.log( round(-5.015, 2) );  // -5.01 wrong

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

/**
 * MidpointRounding away from zero ('arithmetic' rounding)
 * Uses a half-epsilon for correction. (This offsets IEEE-754
 * half-to-even rounding that was applied at the edge cases).
 */

function RoundCorrect(num, precision = 2) {
	// half epsilon to correct edge cases.
	var c = 0.5 * Number.EPSILON * num;
//	var p = Math.pow(10, precision); //slow
	var p = 1; while (precision--> 0) p *= 10;
	if (num < 0)
		p *= -1;
	return Math.round((num + c) * p) / p;
}

// testing some edge cases
console.log(RoundCorrect(1.005, 2));  // 1.01 correct
console.log(RoundCorrect(2.175, 2));  // 2.18 correct
console.log(RoundCorrect(5.015, 2));  // 5.02 correct

console.log(RoundCorrect(-1.005, 2));  // -1.01 correct
console.log(RoundCorrect(-2.175, 2));  // -2.18 correct
console.log(RoundCorrect(-5.015, 2));  // -5.02 correct
1 голос
/ 21 июня 2016

Маленький угловой фильтр, если кто-то хочет:

angular.module('filters').filter('decimalPlace', function() {
    return function(num, precision) {
        var multiplier = Math.pow(10, precision || 0);
        return Math.round(num * multiplier) / multiplier;
    };
});

использовать, если через:

{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}

:)

0 голосов
/ 06 июня 2019

Почему бы не просто

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed : возвращает строку, представляющую данное число, с использованием записи с фиксированной точкой.
  2. Унарный плюс(+) : унарный оператор плюс предшествует своему операнду и вычисляет его операнд, но пытается преобразовать его в число, если это еще не сделано.
0 голосов
/ 31 октября 2018
Math.round( mul/count * 10 ) / 10

Math.round(Math.sqrt(sqD/y) * 10 ) / 10

Спасибо

0 голосов
/ 10 июля 2018

Я нашел способ избежать проблем с точностью:

function badRound (num, precision) {
    const x = 10 ** precision;
    return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1

function round (num, precision) {
    const x = 10 ** (precision + 1);
    const y = 10 ** precision;
    return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01
0 голосов
/ 25 июня 2018

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

Примеры:

roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10

roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9

Код:

function roundWithMaxPrecision (n, precision) {
    return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}
0 голосов
/ 16 февраля 2016

Math.round( num * 10) / 10 не работает.

Например, 1455581777.8-145558160.4 дает вам 1310023617.3999999.

Так что используйте только num.toFixed(1)

0 голосов
/ 10 февраля 2015

Похоже, что это работает надежно во всем, что я кидаю в него:

function round(val, multiplesOf) {
  var s = 1 / multiplesOf;
  var res = Math.ceil(val*s)/s;
  res = res < val ? res + multiplesOf: res;
  var afterZero = multiplesOf.toString().split(".")[1];
  return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}

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

console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1
0 голосов
/ 23 февраля 2015

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

function roundNumericStrings(str , numOfDecPlacesRequired){ 
     var roundFactor = Math.pow(10, numOfDecPlacesRequired);  
     return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString();  }

В противном случае у вас уже есть ответ на предыдущие сообщения

str.slice(0, -1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...