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


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




Answers


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

コードが自明でない場合の詳細

編集:...またはちょうどtoFixed使用して、 ティムBütheが提案したように 。 忘れてしまった1つ、ありがとう(と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の提案に従うか、カスタムのtoFixed()関数を使用するとよいでしょう。

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



注意すべきもう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"



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を使用して半分を丸め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で常に丸められます。 したがって、一貫性はありますが、「標準的な丸め」はありません。




乗算器を使用して浮かび上がるすべてのソリューションに問題があります。 残念ながら、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は同じ問題を抱えているので、ほとんどの人はこの現象によって引き起こされる小さなエラーに気付かないでしょう。 しかし、多くの計算値を追加するたびに誤差が累積する可能性があります。計算の順番や最終結果の誤差を最小限に抑える他の方法を含む理論があります。 小数点の問題を強調するために、0.1 + 0.2はJavaScriptの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