Как вы обходите до 1 десятичной точки в Javascript?

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

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

Ответ 1

Math.round( num * 10) / 10 работает, вот пример...

var number = 12.3456789;
var rounded = Math.round( number * 10 ) / 10;
// rounded is 12.3

если вы хотите иметь одно десятичное место, даже если это будет 0, затем добавьте...

var fixed = rounded.toFixed(1);
// fixed is always to 1dp
// BUT: returns string!

// to get it back to number format
parseFloat( number.toFixed(2) )
// 12.34
// but that will not retain any trailing zeros

// so, just make sure it is the last step before output,
// and use a number format during calculations!

EDIT: добавьте раунд с функцией точности...

Используя этот принцип, для справки, вот небольшая удобная функция, которая принимает точность...

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

... использование...

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

... по умолчанию округляется до ближайшего целого числа (точность 0)...

round(12345.6789) // 12346

... и может использоваться для округления до ближайших 10 или 100 и т.д.

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

... и правильная обработка отрицательных чисел...

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

... и может быть объединен с toFixed в формате последовательно, как строка...

round(456.7, 2).toFixed(2) // "456.70"

Ответ 2

var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

Ответ 3

Если вы используете Math.round(5.01), вы получите 5 вместо 5.0.

Если вы используете toFixed, вы запускаете округление .

Если вы хотите, чтобы лучшее из обоих миров сочетало два:

(Math.round(5.01 * 10) / 10).toFixed(1)

Возможно, вы захотите создать для этого функцию:

function roundedToFixed(_float, _digits){
  var rounder = Math.pow(10, _digits);
  return (Math.round(_float * rounder) / rounder).toFixed(_digits);
}

Ответ 5

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

var rounded = ((num * 10) << 0) * 0.1;

Но эй, так как нет вызовов функций, он злой быстро.:)

И вот тот, который использует сопоставление строк:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

Я не рекомендую использовать строковый вариант, просто скажите.

Ответ 6

Попробуйте с этим:

var original=28.453

// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100  //returns 28.45

// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10  //returns 28.5

// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000  //returns 8.111

менее сложный и простой в реализации...

с этим вы можете создать функцию для:

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}
console.log (RoundAndFix(8.111111, 3));

Ответ 7

x = число, n = десятичные числа:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

Ответ 8

var num = 34.7654;

num = Math.round(num * 10) / 10;

console.log(num); // Logs: 34.8

Ответ 9

Чтобы выполнить лучший ответ:

var round = function ( number, precision )
{
    precision = precision || 0;
    return parseFloat( parseFloat( number ).toFixed( precision ) );
}

Номер входного параметра может "не всегда" быть числом, в этом случае. toFixed не существует.

Ответ 10

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

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

Ответ 11

Если ваш метод не работает, plz разместите свой код.

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

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

Вы получите 234.56

Аналогично

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

даст 234.5

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

Ответ 12

Версия принятого ответа ES 6:

function round(value, precision) {
    const multiplier = 10 ** (precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

Ответ 13

Использование метода toPrecision:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

Ответ 14

Маленький Angular фильтр, если кто захочет:

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}}

:)

Ответ 15

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

Использование экспоненциальной записи правильно обрабатывает округление чисел +ve. Однако этот метод не может правильно округлить крайние случаи -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

Ответ 16

Это похоже на то, что я надежно работает над тем, что я бросаю в него:

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

Ответ 17

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

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

Иначе, если вы этого не сделаете, у вас уже есть ответ от предыдущих сообщений

str.slice(0, -1)

Ответ 18

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

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

Поэтому используйте только num.toFixed(1)

Ответ 19

Я сделал один, который возвращает тип числа, а также помещает десятичные дроби, только если они необходимы (без заполнения 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);
}

Ответ 20

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

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

Ответ 21

Math.round( mul/count * 10 ) / 10

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

Спасибо