Javascript에서 소수점 이하 1 자리로 반올림하는 방법은 무엇입니까?


답변:


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!

편집 : 정밀 함수로 라운드 추가 ...

이 원리를 사용하여 참고로 여기에 정밀한 작은 원형 함수가 있습니다 ...

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()숫자를 원할 때 문자열을 반환하므로 주의하십시오 .
Cobby

1
쿨하고 분명히 사용 parseFloat하면 .toFixed()정수 (0) 인 경우 남은 소수점을 제거 합니다. 일반적으로 수학을하려면 첫 번째 예를 따르는 것이 가장 좋습니다. UI에 숫자를 표시하려면을 사용하십시오 .toFixed().
Cobby

흠 ...이 의미가 있습니다. 숫자로 변환하는 방법은 항상 잘못된 0을 제거해야하므로 문자열을 유지해야합니다. 항상 표시하기 전에 마지막 단계 여야하며 계산에는 사용하지 않아야한다고 생각합니다.
Billy Moon

2
.toFixed()브라우저마다 다른 반올림 결과를 반환 할 수 있으므로 사용에주의하십시오 . 주제에 대한 자세한 내용은 이 게시물 을 읽으십시오 !
Wilt

1
DP가없는 경우 0을 추가 할 수 있습니까?
Nick

101
var number = 123.456;

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

4
때로는 toFixed()글리치가 있습니다-Chrome 브라우저에서을 호출 toFixed()한 다음 문자열로 변환하면 10.00000000068이상하게 보입니다 . 그래도 이것을 확실하게 재현 할 수 없습니다.
Hamish Grubijan

네, 소수의 소수조차도 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)입니까? 내가 직접 답을 찾을 수있는 링크를 게시하십시오. 감사합니다
Shark Lasers


11

에 투표 toFixed()하지만 레코드에 대해서는 비트 시프트를 사용하여 숫자를 int로 캐스팅하는 다른 방법이 있습니다. 따라서 항상 0으로 반올림합니다 (양수의 경우 아래로, 음수의 경우 위로).

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

편집 : ROUND HALF UP을 사용하여 반올림하는 방법을 참조하십시오 . 우리 대부분이 초등학교에서 배운 반올림 모드


아니요 : RoundAndFix (1.005, 2).
Noyo

4

x = 숫자, n = 소수점 이하 자릿수 :

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

아니요 : round (1.005, 2).
Noyo

4

왜 그냥

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed : 고정 소수점 표기법을 사용하여 주어진 숫자를 나타내는 문자열을 반환합니다.
  2. 단항 더하기 (+) : 단항 더하기 연산자는 피연산자 앞에 오며 피연산자로 평가되지만 숫자가 아닌 경우에는 피연산자로 변환하려고 시도합니다.

3
var num = 34.7654;

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

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

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

toPrecision 방법 사용 :

var a = 1.2345
a.toPrecision(2)

// result "1.2"

지금까지 내가 시도한 최선의 대답. 감사.
Ste

하지만 당신이 있기 때문에 조심해야 12.345.toPrecision( 2 )입니다 "12".
Joshua Pinter

2

방법이 작동하지 않으면 plz에서 코드를 게시하십시오.

그러나 다음과 같이 반올림 작업을 수행 할 수 있습니다.

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

당신에게 234.56을 줄 것입니다

비슷하게

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

234.5를 줄 것이다

이런 식으로 위에서 사용한 상수 대신 변수를 사용할 수 있습니다.


1

누구나 원한다면 Little 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}}

:)


1

일반적으로 반올림은 스케일링에 의해 수행됩니다. round(num / p) * p

지수 표기법을 사용하면 + ve 숫자의 반올림을 올바르게 처리합니다. 그러나이 방법은 -ve edge 사례를 올바르게 반올림하지 못합니다.

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

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

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

감사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.