どのようにjavascriptで浮動体をフォーマットするには?


Answers

数値を丸める関数があります。 例えば:

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

5.04が印刷されます。

編集: Fiddle

Question

JavaScriptでは、浮動小数点から文字列に変換するとき、小数点の後にちょうど2桁を得る方法はありますか? たとえば、0.3445434ではなく、0.34となります。




    You can try this if you want don't want to use 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

str.toString().split('.')は、浮動小数点数を文字列に変換し、 '。'で分割します。

結果の変数は、2つの文字列型要素を持つ配列になります。最初の要素は12、2番目の要素は234556になります

str[1].slice(0, 2)は、2番目(234556)の文字列を最初の2つのchar

その後、 str[0]+'.'+res介して最初と結果の文字列を連結するだけstr[0]+'.'+res

これが役立つことを願って




この問題はおそらくもう一つの答えに値するでしょう:DonyとArteQが述べたように、丸めは精度の低下によって影響を受けます(つまり、0.5は0.49999になる可能性があります)。 その結果、四捨五入は半分半分もなく、他の一貫した丸め方法でもなく、使用する方法によらず一貫性のない結果が得られます。

実際にtoFixedも影響を受けます:

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

だからどちらの方法を使用しても、丸めの一貫性が必要な場合は、イプシロンを追加(または削除)してください。

例: toFixedを使用して半分を丸めtoFixed

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

独自の関数を作成し、計算の前にイプシロンを追加/削除する場合も同じです。

更新:

マティアスによって指摘されているように、このメソッドには欠点があります。イプシロンの値0.334999999 ...は0.35ではなく0.34で常に丸められます。 したがって、一貫性はありますが、「標準的な丸め」はありません。




たぶん、小数点記号も必要でしょうか? ここに私が作った関数があります:

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



注意すべきもう1つの問題は、 toFixed()が数字の最後に不要なゼロを生成できることです。 例えば:

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

考え方は、 RegExpを使用して出力をクリーンアップすることです。

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

RegExpは、末尾のゼロ(およびオプションで小数点)を照合して、整数にもよく見えるようにします。

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



/** 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"



ここで私が推測する鍵は、最初に正しく丸めてからStringに変換することです。

function roundOf(n, p) {
    const n1 = n * Math.pow(10, p + 1);
    const n2 = Math.floor(n1 / 10);
    if (n1 >= (n2 * 10 + 5)) {
        return (n2 + 1) / Math.pow(10, p);
    }
    return n2 / Math.pow(10, p);
}

// All edge cases listed in this thread
roundOf(95.345, 2); // 95.35
roundOf(95.344, 2); // 95.34
roundOf(5.0364342423, 2); // 5.04
roundOf(0.595, 2); // 0.60
roundOf(0.335, 2); // 0.34
roundOf(0.345, 2); // 0.35
roundOf(551.175, 2); // 551.18
roundOf(0.3445434, 2); // 0.34

これでtoFixed(p)でこの値を安全にフォーマットすることができます。 だからあなたの特定の場合:

roundOf(0.3445434, 2).toFixed(2); // 0.34