[javascript] JavaScript에서 소수점 이하 두 자리로 숫자 서식 지정

내 코드를 소수점 이하 두 자리로 반올림합니다. 그러나 나는 10.8, 2.4 등의 숫자를 얻습니다. 이들은 소수점 이하 두 자리에 대한 아이디어가 아니므로 어떻게 다음을 개선 할 수 있습니까?

Math.round(price*Math.pow(10,2))/Math.pow(10,2);

10.80, 2.40 등과 같은 숫자를 원합니다. jQuery를 사용하면 좋습니다.



답변

고정 소수점 표기법을 사용하여 숫자를 포맷하려면 toFixed 메소드 를 사용하면 됩니다.

(10.8).toFixed(2); // "10.80"

var num = 2.4;
alert(num.toFixed(2)); // "2.40"

toFixed()문자열 을 반환합니다.

중요 : toFixed는 90 %의 시간을 반올림하지 않으며 반올림 된 값을 반환하지만 대부분의 경우 작동하지 않습니다.

예를 들어 :

2.005.toFixed(2) === "2.00"

최신 정보:

요즘에는 Intl.NumberFormat생성자를 사용할 수 있습니다 . ECMAScript 국제화 API 사양 (ECMA402) 의 일부입니다 . 그것은이 꽤 좋은 브라우저 지원 도 IE11을 포함, 그것은되어 완전히 Node.js를 지원 .

const formatter = new Intl.NumberFormat('en-US', {
   minimumFractionDigits: 2,
   maximumFractionDigits: 2,
});

console.log(formatter.format(2.005)); // "2.01"
console.log(formatter.format(1.345)); // "1.35"

toLocaleString내부적으로 IntlAPI 를 사용하는 메소드를 대신 사용할 수 있습니다 .

const format = (num, decimals) => num.toLocaleString('en-US', {
   minimumFractionDigits: 2,
   maximumFractionDigits: 2,
});


console.log(format(2.005)); // "2.01"
console.log(format(1.345)); // "1.35"

이 API는 또한 천 단위 구분 기호, 통화 기호 등과 같이 서식을 지정할 수있는 다양한 옵션을 제공합니다.


답변

이 주제는 오래된 주제이지만 여전히 최상위 Google 결과이며 제공되는 솔루션은 동일한 부동 소수점 10 진수 문제를 공유합니다. MDN 덕분에 내가 사용하는 (매우 일반적인) 기능은 다음과 같습니다 .

a
function round(value, exp) {
  if (typeof exp === 'undefined' || +exp === 0)
    return Math.round(value);

  value = +value;
  exp = +exp;

  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));

  // Shift back
  value = value.toString().split('e');
  return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}

우리가 볼 수 있듯이 다음과 같은 문제는 발생하지 않습니다.

round(1.275, 2);   // Returns 1.28
round(1.27499, 2); // Returns 1.27

이 일반성은 멋진 것들도 제공합니다.

round(1234.5678, -2);   // Returns 1200
round(1.2345678e+2, 2); // Returns 123.46
round("123.45");        // Returns 123

이제 OP의 질문에 대답하려면 다음을 입력해야합니다.

round(10.8034, 2).toFixed(2); // Returns "10.80"
round(10.8, 2).toFixed(2);    // Returns "10.80"

또는보다 간결하고 덜 일반적인 기능의 경우 :

function round2Fixed(value) {
  value = +value;

  if (isNaN(value))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));

  // Shift back
  value = value.toString().split('e');
  return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}

당신은 그것을 호출 할 수 있습니다 :

round2Fixed(10.8034); // Returns "10.80"
round2Fixed(10.8);    // Returns "10.80"

다양한 예제와 테스트 ( @ tj-crowder 덕분에 !) :


답변

나는 보통 이것을 내 개인 라이브러리에 추가하고 @TIMINeutron 솔루션을 사용하고 몇 가지 길이를 사용하여 소수 길이에 적합하게 만들면 가장 적합합니다.

function precise_round(num, decimals) {
   var t = Math.pow(10, decimals);
   return (Math.round((num * t) + (decimals>0?1:0)*(Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
}

보고 된 예외에 대해 작동합니다.


답변

이전 답변에 주석을 추가 할 수없는 이유를 모르겠지만 (아마도 나는 장님, 맹목적이지만) @Miguel의 답변을 사용하여 해결책을 찾았습니다.

function precise_round(num,decimals) {
   return Math.round(num*Math.pow(10, decimals)) / Math.pow(10, decimals);
}

그리고 @bighostkim과 @Imre의 두 가지 의견 :

  • precise_round(1.275,2)1.28을 반환하지 않는 문제
  • precise_round(6,2)6.00을 반환하지 않는 문제 (원하는대로).

나의 마지막 해결책은 다음과 같습니다.

function precise_round(num,decimals) {
    var sign = num >= 0 ? 1 : -1;
    return (Math.round((num*Math.pow(10,decimals)) + (sign*0.001)) / Math.pow(10,decimals)).toFixed(decimals);
}

보시다시피, 나는 약간의 “수정”을 추가해야했습니다. 그것은 그것이 아닙니다. 그러나 Math.round는 손실이 있기 때문에-당신은 jsfiddle.net에서 그것을 확인할 수 있습니다-이것이 “수정 방법을 아는 유일한 방법입니다” “)). 이미 채워진 숫자에 0.001을 더하므로 소수점 오른쪽에 13 0을 더합니다. 따라서 사용하는 것이 안전해야합니다.

그 후 나는 .toFixed(decimal)항상 올바른 형식으로 올바른 숫자를 출력하도록 추가 했습니다.

그래서 그것은 거의 다입니다. 잘 사용하십시오;)

편집 : 음수의 “수정”에 기능이 추가되었습니다.


답변

100 % 확신하는 한 가지 방법은 소수점 이하 자릿수 2 개를 얻는 것입니다.

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

이로 인해 반올림 오류가 발생하면 James가 주석에서 설명한대로 다음을 사용할 수 있습니다.

(Math.round((num * 1000)/10)/100).toFixed(2)


답변

toFixed (n)은 소수점 다음에 n 길이를 제공합니다. toPrecision (x)는 x 총 길이를 제공합니다.

아래이 방법을 사용하십시오

// Example: toPrecision(4) when the number has 7 digits (3 before, 4 after)
    // It will round to the tenths place
    num = 500.2349;
    result = num.toPrecision(4); // result will equal 500.2

그리고 숫자를 고정 사용하려면

result = num.toFixed(2);


답변

이 문제에 대한 정확한 해결책을 찾지 못했기 때문에 내 자신을 만들었습니다.

function inprecise_round(value, decPlaces) {
  return Math.round(value*Math.pow(10,decPlaces))/Math.pow(10,decPlaces);
}

function precise_round(value, decPlaces){
    var val = value * Math.pow(10, decPlaces);
    var fraction = (Math.round((val-parseInt(val))*10)/10);

    //this line is for consistency with .NET Decimal.Round behavior
    // -342.055 => -342.06
    if(fraction == -0.5) fraction = -0.6;

    val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
    return val;
}

예 :

function inprecise_round(value, decPlaces) {
  return Math.round(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}

function precise_round(value, decPlaces) {
  var val = value * Math.pow(10, decPlaces);
  var fraction = (Math.round((val - parseInt(val)) * 10) / 10);

  //this line is for consistency with .NET Decimal.Round behavior
  // -342.055 => -342.06
  if (fraction == -0.5) fraction = -0.6;

  val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
  return val;
}

// This may produce different results depending on the browser environment
console.log("342.055.toFixed(2)         :", 342.055.toFixed(2)); // 342.06 on Chrome & IE10

console.log("inprecise_round(342.055, 2):", inprecise_round(342.055, 2)); // 342.05
console.log("precise_round(342.055, 2)  :", precise_round(342.055, 2));   // 342.06
console.log("precise_round(-342.055, 2) :", precise_round(-342.055, 2));  // -342.06

console.log("inprecise_round(0.565, 2)  :", inprecise_round(0.565, 2));   // 0.56
console.log("precise_round(0.565, 2)    :", precise_round(0.565, 2));     // 0.57