javascript - 어떻게 자바 스크립트에서 float을 포맷?


JavaScript에서는 부동 소수점을 문자열로 변환 할 때 소수점 이하 2 자리를 어떻게 얻을 수 있습니까? 예 : 0.3445434 대신 0.34.



Answers



var result = Math.round(original*100)/100;

코드가 자명하지 않은 경우 의 세부 사항 .

edit : ... 또는 TimBüthe가 제안한대로 toFixed 사용 하십시오 . 잊어 버린 그 하나, 감사 (및 upvote)에 대한 알림 :)




숫자를 반올림하는 함수가 있습니다. 예 :

var x = 5.0364342423;
print(x.toFixed(2));

5.04가 인쇄됩니다.

편집 : 바이올린




toFixed() 사용할 때는주의하십시오.

첫째, 숫자의 반올림은 숫자의 이진 표현을 사용하여 수행되므로 예기치 않은 동작이 발생할 수 있습니다. 예를 들어

(0.595).toFixed(2) === '0.59'

'0.6' 대신.

둘째, toFixed() IE 버그가 있습니다. IE에서는 (적어도 버전 7까지는 IE8을 확인하지 않았습니다.) 다음 내용이 적용됩니다.

(0.9).toFixed(0) === '0'

kkyy의 제안을 따르거나 custom toFixed() 함수를 사용하는 것이 좋습니다.

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



알고 있어야 할 또 하나의 문제는 toFixed() 가 숫자 끝에 불필요한 0을 생성 할 수 있다는 것입니다. 예 :

var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"

아이디어는 RegExp 사용하여 출력을 정리하는 것입니다.

function humanize(x){
  return x.toFixed(6).replace(/\.?0*$/,'');
}

RegExp 는 후행 0 (및 선택적으로 소수점)과 일치하여 정수도 잘 보이는지 확인합니다.

humanize(23-7.37)
"15.63"
humanize(1200)
"1200"
humanize(1200.03)
"1200.03"
humanize(3/4)
"0.75"
humanize(4/3)
"1.333333"



var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding



Dony와 ArteQ에서 언급했듯이 반올림은 정밀도의 손실로 영향을받습니다 (즉, 0.5는 0.49999가 될 수 있습니다 ...). 결과적으로 반올림은 반반반반 기도 아니며 다른 일관된 반올림 방법도 아니며 사용하는 방법에 관계없이 일관성없는 결과를 가져옵니다.

실제로 toFixed 도 영향을받습니다.

(0.335).toFixed(2) == 0.34
(0.345).toFixed(2) == 0.34

그래서 어떤 방법을 사용 하든지, 반올림에 일관성이 필요하면 엡실론을 추가 (또는 제거)하는 것이 좋습니다.

예 : toFixed 사용하여 반올림 반올림하기 :

var epsilon = 0.001;
(0.335 + epsilon).toFixed(2) == 0.34;
(0.345 + epsilon).toFixed(2) == 0.35;

자신의 함수를 작성하고, 계산 전에 엡실론을 추가 / 삭제하는 경우도 마찬가지입니다.

업데이트 :

matias가 지적했듯이이 메서드에는 결함이 있습니다. 즉, 엡실론 값인 0.334999999 ...는 항상 0.35 대신 0.34로 반올림됩니다. 그러므로 우리는 일관성이 있지만 "표준 반올림"은 아닙니다.




승수를 사용하여 주변에 떠 다니는 모든 솔루션에 문제가 있습니다. kkyy와 Christoph의 해결책은 모두 불행하게도 잘못되었습니다.

2 자리 소수점 551.175에 대한 코드를 테스트하십시오 - 551.17반올림 되지만 551.18 이어야합니다! 하지만 전 예를 시험하면. 451.175 괜찮을 것입니다 - 451.18. 첫눈에이 오류를 발견하는 것은 어렵습니다.

문제는 다음과 같이 곱하는 것입니다. try 551.175 * 100 = 55117.49999999999 (ups!)

그래서 내 생각은 toFixed ()로 Math.round ()를 사용하기 전에 그것을 처리하는 것이다.

function roundFix(number, precision)
{
    var multi = Math.pow(10, precision);
    return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}



function trimNumber(num, len) {
  const modulu_one = 1;
  const start_numbers_float=2;
  var int_part = Math.trunc(num);
  var float_part = String(num % modulu_one);
      float_part = float_part.slice(start_numbers_float, start_numbers_float+len);
  return int_part+'.'+float_part;
}



어쩌면 소수 구분 기호도 필요합니까? 여기에 방금 만든 함수가 있습니다.

function formatFloat(num,casasDec,sepDecimal,sepMilhar) {
    if (num < 0)
    {
        num = -num;
        sinal = -1;
    } else
        sinal = 1;
    var resposta = "";
    var part = "";
    if (num != Math.floor(num)) // decimal values present
    {
        part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded)
        while (part.length < casasDec)
            part = '0'+part;
        if (casasDec > 0)
        {
            resposta = sepDecimal+part;
            num = Math.floor(num);
        } else
            num = Math.round(num);
    } // end of decimal part
    while (num > 0) // integer part
    {
        part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits
        num = Math.floor(num/1000);
        if (num > 0)
            while (part.length < 3) // 123.023.123  if sepMilhar = '.'
                part = '0'+part; // 023
        resposta = part+resposta;
        if (num > 0)
            resposta = sepMilhar+resposta;
    }
    if (sinal < 0)
        resposta = '-'+resposta;
    return resposta;
}



곱셈 또는 나눗셈을 사용하여 실제 값으로 x.xx5를 갖는 가격의 일관성없는 반올림을 방지 할 수있는 방법이 없습니다. 클라이언트 측에서 정확한 가격을 계산해야하는 경우 모든 금액을 센트로 유지해야합니다. 이것은 JavaScript에서 숫자 값의 내부 표현의 특성 때문입니다. Excel은 동일한 문제로 고통 받고 있으므로 대부분의 사람들은이 현상으로 인한 작은 오류를 알지 못합니다. 그러나 계산 된 값을 많이 추가 할 때마다 오류가 누적 될 수 있습니다. 최종 결과에서 오류를 최소화하기위한 계산 및 다른 방법의 순서와 관련된 전체 이론이 있습니다. 십진수 값의 문제를 강조하기 위해 JavaScript에서 0.1 + 0.2는 0.3과 정확히 같지 않으며 1 + 2는 3과 같습니다.




/** don't spend 5 minutes, use my code **/
function prettyFloat(x,nbDec) { 
    if (!nbDec) nbDec = 100;
    var a = Math.abs(x);
    var e = Math.floor(a);
    var d = Math.round((a-e)*nbDec); if (d == nbDec) { d=0; e++; }
    var signStr = (x<0) ? "-" : " ";
    var decStr = d.toString(); var tmp = 10; while(tmp<nbDec && d*tmp < nbDec) {decStr = "0"+decStr; tmp*=10;}
    var eStr = e.toString();
    return signStr+eStr+"."+decStr;
}

prettyFloat(0);      //  "0.00"
prettyFloat(-1);     // "-1.00"
prettyFloat(-0.999); // "-1.00"
prettyFloat(0.5);    //  "0.50"



    You can try this if you want don't want rounding
`function myFunction() {
        var str = 12.234556; 
        str = str.toString().split('.');
        var res = str[1].slice(0, 2);
        document.getElementById("demo").innerHTML = str[0]+'.'+res;
    }`
output:12.23