Як округлити до 1 десяткового знака у Javascript?


378

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

Я спробував * 10, круглий / 10, але він залишає два десяткові дна в кінці int.


9
Math.round(n * 10) / 10справді працює. Який у вас код?
Бен Флемінг

Відповіді:


729

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 1 d.p.
// NOTE: .toFixed() returns a string!

// To convert 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"

45
Будьте обережні, використовуючи, .toFixed()оскільки він повертає рядок, коли ви, можливо, хочете число.
Коббі

1
Класно, очевидно, за допомогою parseFloatвидалення десяткових знаків, які залишилися, .toFixed()якщо це ціле число (нулі). Як правило, якщо ви хочете займатися математикою, найкраще наслідувати ваш перший приклад. Якщо ви хочете відобразити номер у своєму інтерфейсі, тоді використовуйте .toFixed().
Коббі

Гммм ... це має сенс, будь-який спосіб, який ви перетворюєте на число, повинен завжди знімати помилкові нулі, саме тому він повинен залишатися рядком. Я думаю, що це завжди повинен бути останнім кроком до відображення, а не використовуватись у розрахунках.
Біллі Мун

2
Будьте обережні, .toFixed()оскільки це може повернути різні результати округлення для різних браузерів. Прочитайте цей пост для подробиць по темі!
Wilt

1
Чи можу я додати нуль, якщо немає DP?
Нік

101
var number = 123.456;

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

4
Іноді toFixed()є глюки - я бачив це в браузері Chrome, куди дзвоню toFixed(), потім перетворюється на рядок, і він показує щось на кшталт 10.00000000068- дивно. Однак це не може надійно відтворити.
Гаміш Грубіян

Так, я вичитав глюки з toFixed () навіть за допомогою декількох десяткових знаків. Він округлює дріб 4 до наступного вищого числа замість нижчого, якщо я правильно пам'ятаю.
Далібор

1
як згадував @cobby вище: будьте обережні, .toFixed()оскільки він повертається, Stringколи ви, можливо, захочетеNumber
Рікардо,

28

Якщо ви використовуєте, Math.round(5.01)ви отримаєте 5замість 5.0.

Якщо ви використовуєте, toFixedви стикаєтеся з проблемами округлення .

Якщо ви хочете найкращого з обох світів, комбінуйте два:

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

Ви можете створити для цього функцію:

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

Чому підкреслює парами, тобто (_float, _digits)? Не соромтесь просто розмістити посилання, де я можу знайти відповідь для себе. Спасибі
акули Лазери


11

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

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

Але ей, оскільки функціональних викликів немає, це нечестиво швидко. :)

І ось такий, який використовує відповідність рядків:

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

Я не рекомендую використовувати варіант рядка, просто скажіть.


7

Спробуйте з цим:

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

РЕДАКТУВАННЯ : див. Як "Закруглення" за допомогою КРУГОЇ ПОЛОВИНИ Вгору. Режим заокруглення, якого більшість із нас навчали в школі


Нія: RoundAndFix (1.005, 2).
Нойо

4

x = число, n = десяткові місця:

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

Ніпе: круглий (1.005, 2).
Нойо

4

Чому б не просто

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed : повертає рядок, що представляє задане число, використовуючи позначення з фіксованою точкою.
  2. Unary plus (+) : Оператор unary plus передує своєму операнду і оцінює його операнд, але намагається перетворити його в число, якщо його ще немає.


3

Щоб заповнити найкращу відповідь:

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

Номер вхідного параметра "може" не завжди бути числом, в цьому випадку .toFixed не існує.


3

ES 6 Версія прийнятого відповіді:

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

3

Використовуючи метод точності:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

На сьогодні найкраща відповідь, яку я спробував. Дякую.
Ste

Але ти повинен бути обережним, бо 12.345.toPrecision( 2 )є "12".
Джошуа Пінтер

2

Якщо ваш метод не працює, опублікуйте код, який у вас є.

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

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

Дасть вам 234,56

Аналогічно

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

Дасть 234,5

Таким чином ви можете використовувати змінну замість константи, як було використано вище.


1

Маленький кутовий фільтр, якщо хто хоче цього:

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

:)


1

Загалом, округлення проводиться шляхом масштабування: 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


0

Здається, це надійно працює над усім, що я на це кидаю:

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

Якщо ви дбаєте про правильне округлення, виконайте такі дії:

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

Ще якщо ви цього не зробите, у вас уже є відповідь з попередніх дописів

str.slice(0, -1)

0

Math.round( num * 10) / 10 не працює.

Наприклад, 1455581777.8-145558160.4дає вам 1310023617.3999999.

Тож використовуйте тільки num.toFixed(1)


0

Я зробив такий, який повертає числовий тип, а також розміщує десяткові знаки лише за потреби (немає 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

Я знайшов спосіб уникнути проблем із точністю:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.