floating-point byte配列 変数 - どのようにjavascriptで浮動体をフォーマットするには?





6 Answers

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

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

5.04が印刷されます。

編集: Fiddle

宣言 uint8array 文字列

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




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



乗算器を使用して浮かび上がるすべてのソリューションに問題があります。 残念ながら、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;
}



乗算または除算のいずれかを使用してx.xx5の価格が実際の値として不一致にならないようにする方法はありません。 クライアント側で正しい価格を計算する必要がある場合は、すべての金額をセントに保つ必要があります。 これはJavaScriptの数値の内部表現の性質によるものです。 Excelは同じ問題を抱えているので、ほとんどの人はこの現象によって引き起こされる小さなエラーに気付かないでしょう。 しかし、多くの計算値を追加するたびに誤差が累積する可能性があります。計算の順番や最終結果の誤差を最小限に抑える他の方法を含む理論があります。 小数点の問題を強調するために、0.1 + 0.2はJavaScriptの0.3に正確には等しくなく、1 + 2は3に等しいことに注意してください。




私は浮動体をフォーマットするためにこのコードを使用します。 これはtoPrecision()基づいていtoPrecision()が、不要なゼロをtoPrecision()ます。 私は正規表現を単純化する方法の提案を歓迎する。

function round(x, n) {
    var exp = Math.pow(10, n);
    return Math.floor(x*exp + 0.5)/exp;
}

使用例:

function test(x, n, d) {
    var rounded = rnd(x, d);
    var result = rounded.toPrecision(n);
    result = result.replace(/\.?0*$/, '');
    result = result.replace(/\.?0*e/, 'e');
    result = result.replace('e+', 'e');
    return result;  
}

document.write(test(1.2000e45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2000e+45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2340e45, 3, 2) + '=' + '1.23e45' + '<br>');
document.write(test(1.2350e45, 3, 2) + '=' + '1.24e45' + '<br>');
document.write(test(1.0000, 3, 2) + '=' + '1' + '<br>');
document.write(test(1.0100, 3, 2) + '=' + '1.01' + '<br>');
document.write(test(1.2340, 4, 2) + '=' + '1.23' + '<br>');
document.write(test(1.2350, 4, 2) + '=' + '1.24' + '<br>');



Related