소수점 이하 두 자리를 항상 표시하는 형식 번호


782

해당하는 경우 항상 반올림하여 소수점 이하 2 자리를 표시하도록 숫자 형식을 지정하고 싶습니다.

예 :

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

나는 이것을 사용했다 :

parseFloat(num).toFixed(2);

그러나이 아닌으로 표시 1됩니다 .11.00


2
1을 입력하면 숫자가 1.00으로 표시되지 않지만 1.345를 입력하면 1.35
Varada

1
나는 당신이 찾고 있다고 생각하는 것에 당신의 질문을 다시 한 번 말하였습니다. 제대로 이해했는지 확인하십시오.
꾸준히

즉, 지원을 통한 정확한 라운딩. gist.github.com/ArminVieweg/28647e735aa6efaba401
TarranJones


답변:


1116
(Math.round(num * 100) / 100).toFixed(2);

라이브 데모

이 점에 유의 반올림 입력이 때문에, 2 진수 곳으로 1.346돌아갑니다 1.35.


6
@Kooilnc : 영업 이익은 원 1으로 표시 1.00하고, 1.341로 표시 1.34.
꾸준히

49
toFixed ()가 반올림하므로 round ()를 사용할 필요가 없습니다.
밀라노 Babuškov

27
toFixed ()는 반올림하지만 문자열을 반환하는 것을 잊지 마십시오 ...이 방법은 실제로 표시에만 유용합니다. 반올림 된 값에 대해 추가 수학적 계산을 수행하려면 toFixed ()를 사용하지 마십시오.
TWright

8
MDN에 따르면 Math.round는 반올림 오류로 인해 항상 정확한 결과를 제공하지는 않습니다. 1.005로 이것을 테스트했는데 1.01로 반올림해야하지만 1.00이됩니다. 일관된 정확성을 위해 내 대답을 사용하십시오 : stackoverflow.com/a/34796988/3549440 .
Nate

13
이 전체 답변을로 줄일 수 있습니다 (+num).toFixed(2). 심지어 원래의 반올림 버그도 유지합니다 . Nate 's answer을 참조하십시오 .
RobG

321
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35


1
마지막 줄은 거짓입니다. 나는``수 (1.365) .toFixed (2) 반환 "1.37"크롬 콘솔에서이 시도하고
앙드레을

1
@Andre, Chrome 29.0.1547.57은 1.34표현을 제공 합니다 Number(1.345).toFixed(2).
Drew Noakes

1
toFixed 반올림을 수행 하므로 거의 모든 테스트 번호에서 볼 수 있습니다.
andy

40
실수로 마무리하기 전에 마지막 주석을 제출했습니다 .... 1.345부동 소수점에 정확하게 저장할 수없는 숫자의 예입니다. 원하는대로 반올림하지 않는 이유는 실제로 숫자로 약간 저장되어 있기 때문입니다. 1.345보다 작고 내림합니다. 대신 테스트 (1.34500001).toFixed(2)하면 올바르게 올림됩니다.1.35
andy

94

이 답변 은 실패합니다 value = 1.005.

더 나은 해결책으로 지수 표기법으로 표시된 숫자를 사용하여 반올림 문제를 피할 수 있습니다.

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

@Kon이 제안한 깔끔한 코드와 원저자 :

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

toFixed()소수점을 유지하기 위해 끝에 추가 할 수 있습니다 ( 예 :: 1.00문자열로 반환 됨).

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

크레딧 : 반올림 십진수 자바 스크립트


13
놀랍게도, 여기 다른 사람들 toFixed은 그 반올림 문제가 있다는 것을 보지 못했습니다 . 당신의 대답은 받아 들여 져야합니다.
Armfoot

1
이것이 여전히 사실인지 테스트했습니다. 여전히 Chrome 버전 59.0.3071.115에 맞습니다. 솔루션은 1.005 (1.01)로 올림하고 1.00499999 (1.00)로
올림

jsfiddle.net/Artistan/qq895bnp/28 toFixed가 작동하는 "시간"이 있지만 매우 일관성이 없습니다. :)
Artistan

parseFloat의 서라운드 번호는 반환 문자열입니다.
user889030

1
이것은 확실한 대답입니다. 내가 생각할 수있는 몇 가지 개선 사항 : (1) VS Code (TypeScript 파일)는 Math.round ()가 문자열을 전달하는 것을 좋아하지 않습니다. (2) 소수점 이하 자릿수를 동적으로 만듭니다 (2로 하드 코딩되지 않음). (3) toFixed ()가 불필요한 것 같습니다. 제가 생각 Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
Kon

23
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120

그것은 1.4, 23.654, 0이 될 수 있다면 예기치 않은 결과를 낳습니다.
shinzou

2
OP는 "해당되는 경우 반올림"을 요청합니다 . toPrecision숫자를 특정 소수점 이하 자릿수로 서식 지정하기 만하면 됩니다 . 이것은 물론 매우 유용 할 수 있지만 차이점을 이해하는 것이 중요합니다.
보아스-복원 모니카

1
Mozilla에 따르면 실제로 toPrecision 은 반올림합니다. 테스트 :(20.55).toPrecision(3) "20.6"
James L.

2
당신이 원하는 경우 0을 후행 제거 , 숫자에 캐스팅 또는 플로트 사용 후 toFixed: const formattedVal = Number(val.toFixed(2));마 사용하지 toPrecision정밀 PARAM를 사용하는 경우가 아닌 십진수를 계산으로.
James L.

17

가장 정확한 반올림을 위해 다음 함수를 작성하십시오.

function round(value, decimals) {
    return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}

소수점 이하 두 자리로 반올림하는 데 사용하십시오.

console.log("seeked to " + round(1.005, 2));
> 1.01

Razu , 기사 및 MDN의 Math.round 참조 덕분 입니다.


1
1.0049999999999998934는 어떻습니까?
4esn0k

1
그것은
2dp를

1
테스트 된 jsfiddle.net/Artistan/qq895bnp , 이것이 내가 본 유일한 일관된 방법입니다. 감사.
Artistan

16

최신 브라우저의 경우 다음을 사용하십시오 toLocaleString.

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

소수 구분 기호 를 제어하려면 로케일 태그를 첫 번째 매개 변수로 지정하십시오 . 도트의 경우 예를 들어 영어 미국 로캘을 사용하십시오.

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

이것은 다음을 제공합니다.

1.35

유럽의 대부분의 국가는 쉼표를 소수점 구분 기호로 사용하므로 스웨덴어 / 스웨덴 로케일을 사용하는 경우 :

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

그것은 줄 것이다 :

1,35


왜 이것이 다운 보트인지 잘 모르겠지만, 그것은 나에게 잘 작동하는 것 같습니다. 이 문제가 발생했을 경우 공감하려는 경우 의견을 추가하십시오!
John Culviner 2016 년

13

가장 간단한 답변 :

var num = 1.2353453;
num.toFixed(2); // 1.24

예 : http://jsfiddle.net/E2XU7/


11
글쎄, toFixed이미 stackoverflow.com/a/13292833/218196 에서 제안되었습니다 . 질문에 어떤 추가 정보가 제공됩니까?
Felix Kling

그 대답에는 둥근 기능이 포함되어 있지 않으며 내 대답에는 tho가 포함되어 있습니다.
macio.Jun

8
어? 정확히 같은 대답입니다. 전화 toFixed번호에.
Felix Kling

1
정확하고 동일한 기능이지만 그 대답의 결과는 오도의 소지가 있습니다. 라운드 기능을 표현하여 수정했습니다.
macio.Jun

질문은 "... 해당되는 경우 반올림"입니다. 당신의 대답은 반올림을 포함하지 않습니다.
Chris

12

N 자리로 반올림하는 훨씬 일반적인 솔루션

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346

1
이 alswer roundN(-3.4028230607370965e+38,2)는 0에 가까운 특정 숫자로 실패 "-3.4028230607370965e+38"하고 예상되는 0.00 대신에 반환
Ferrybig

재미있는 @Ferrybig 나는 당신이 언급 한 숫자를 테스트하고 해결 방법을 생각합니다, 테스트 주셔서 감사합니다
PirateApp

1
앞에서 언급 한 숫자는 0을 나타내지 않아야하지만 대신 큰 숫자는 뇌의 오류 일뿐입니다. 그러나 여전히 소수점 2 자리를 표시하지 않기 때문에 작동하지 않습니다
Ferrybig


9

이미 jQuery를 사용하고 있다면 jQuery Number Format 플러그인 을 사용할 있습니다.

플러그인은 형식화 된 숫자를 문자열로 리턴 할 수 있으며 소수 및 천 단위 구분 기호를 설정할 수 있으며 표시 할 소수 자릿수를 선택할 수 있습니다.

$.number( 123, 2 ); // Returns '123.00'

GitHub에서 jQuery Number Format을 얻을 수도 있습니다 .


11
플러그인을 사용하는 것은 "고정 길이 십진 부분을 갖기"만하면됩니다.
Lashae

9
@Lashae, 확실히, 당신이하고 싶은 모든 것이면. OP 또는 다른 사람이 플러그인이 제공하는 추가 기능을 원할 경우 이것을 게시했습니다.
Sam Sehnert

질문의 포스터가 물론 jQuery 태그를 추가
했다면

7

이게 네가 뜻한 바냐?

function showAsFloat(num, n){
      return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}

document.querySelector('#result').textContent = 
    [
     'command                      | result',
     '-----------------------------------------------',
     'showAsFloat(1);              | ' + showAsFloat(1),
     'showAsFloat(1.314);          | ' + showAsFloat(1.314),
     'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
     'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
     'showAsFloat(2456198, 5)      | ' + showAsFloat('2456198', 5),
     'showAsFloat(0);              | ' + showAsFloat(0)
    ].join('\n');
<pre id="result"></pre>


6

소수점 이하 두 자리 만 유지하면서 숫자를 문자열로 변환합니다.

var num = 5.56789;
var n = num.toFixed(2);

n의 결과는 다음과 같습니다.

5.57

4

당신은 바닥을 찾고 있습니까?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00

4
나는 그가 가장 가까운 정수로 내림하고 싶지 않다고 생각합니다.
꾸준히

그래, 나는 설명에서 확실하지 않았지만, 나는 단지 그것을 incase에 버리고 있었다
samwise

3
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00

3

소수점 이하 자릿수를 지정할 수있는 일반 함수도 있습니다.

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}

3

특정 형식이 필요한 경우 고유 한 루틴을 작성하거나 필요한 기능을 수행하는 라이브러리 함수를 사용해야합니다. 기본 ECMAScript 기능은 일반적으로 형식이 지정된 숫자를 표시하기에 충분하지 않습니다.

반올림 및 서식에 대한 자세한 설명은 다음과 같습니다. http://www.merlyn.demon.co.uk/js-round.htm#RiJ

일반적으로 반올림 및 서식은 출력 전 마지막 단계로만 수행해야합니다. 더 일찍 그렇게하면 예기치 않은 큰 오류가 발생하여 서식이 손상 될 수 있습니다.


JS / Ecma 플랫폼 전체에 늦게 참여하기 위해 자신의 선택에 따라 머리를 흔드는 경우가 있습니다. :( "특정 서식이 필요한 경우 고유 한 루틴을 작성하거나 필요한 기능을 수행하는 라이브러리 함수를 사용해야합니다. 기본 ECMAScript 기능은 일반적으로 서식이 지정된 숫자를 표시하기에 충분하지 않습니다." 그러나 그 사실이 존재하기 때문에
슬프게도

2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>


2

가장 긴 스레드 중 하나를 실행하십시오. 아래는 내 솔루션입니다.

parseFloat(Math.round((parseFloat(num * 100)).toFixed(2)) / 100 ).toFixed(2)

누구나 구멍을 뚫을 수 있는지 알려주세요


2


2
이 코드는 요구 사항을 충족시키기에 충분합니다 parseFloat(num.toFixed(2))
kva

1

당신은 우리에게 전체 그림을 제공하지 않습니다.

javascript:alert(parseFloat(1).toFixed(2))위치 표시 줄에 붙여 넣을 때 브라우저에 1.00이 표시됩니다. 그러나 나중에 무언가를하면 되돌릴 것입니다.

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00

FF 50, Chrome 49 및 IE 8에서 작동
Florian Straub

1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);

1

toFixed () 호출을 수행하기 전에 parseFloat () 및 Number () 변환을 결정해야했습니다. 다음은 숫자 캡처 후 캡처 사용자 입력의 예입니다.

HTML :

<input type="number" class="dec-number" min="0" step="0.01" />

이벤트 핸들러:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

위의 코드는 TypeError 예외를 발생시킵니다. html 입력 유형이 "숫자"이지만 사용자 입력은 실제로 "문자열"데이터 유형입니다. 그러나 toFixed () 함수는 숫자 인 오브젝트에서만 호출 될 수 있습니다.

최종 코드는 다음과 같습니다.

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

Number () vs. parseFloat ()으로 캐스팅하는 것을 선호하는 이유는 빈 입력 문자열이나 NaN 값에 대해 추가 유효성 검사를 수행 할 필요가 없기 때문입니다. Number () 함수는 빈 문자열을 자동으로 처리하여 0으로 숨 깁니다.


0

나는 좋아한다 :

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

소수점 이하 두 자릿수로 반올림 한 다음 parseFloat() 문자열 또는 숫자인지에 상관없이 문자열이 아닌 숫자를 반환 하도록 구문 분석해야합니다 .


목적이 소수점 이하 2 자릿수로 표시되는 것이라면 float을 구문 분석하면 그 결과가 엉망이됩니다. 예parseFloat("1.00") // 1
Stijn de Witt

0

정밀한 방법으로 Math 객체 확장

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)



0

다음은 플로어 만 사용하여 반올림하는 또 다른 솔루션입니다. 즉, 계산 된 금액이 원래 금액 (거래에 필요한 경우)보다 크지 않아야합니다.

Math.floor(num* 100 )/100;

0

이 코드를 사용해보십시오 :

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.56

0

아래 코드를보십시오 :

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}


-3

이것이 내 문제를 해결하는 방법입니다.

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