1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptで大きな数の科学的記法を避けるには?

2022-04-02 10:43:09

質問

JavaScriptは、21桁以上の整数を文字列のコンテキストで使用する場合、科学的記法に変換します。私は整数をURLの一部として印刷しています。どうすればこの変換を防ぐことができますか?

どのように解決するのですか?

そこに 数値.toFixed しかし、これは、数値が >= 1e21 で、最大精度が 20 の場合、科学的記法を使用します。それ以外は、自分で作ることもできますが、面倒でしょう。

function toFixed(x) {
  if (Math.abs(x) < 1.0) {
    var e = parseInt(x.toString().split('e-')[1]);
    if (e) {
        x *= Math.pow(10,e-1);
        x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
    }
  } else {
    var e = parseInt(x.toString().split('+')[1]);
    if (e > 20) {
        e -= 20;
        x /= Math.pow(10,e);
        x += (new Array(e+1)).join('0');
    }
  }
  return x;
}

上記では、安価で簡単な文字列の繰り返し ( (new Array(n+1)).join(str) ). この場合 String.prototype.repeat をロシア農民の掛け算で使って、それを代わりに使う。

この回答は、科学的記数法を使わずに大きな数を表示する、という質問の文脈にのみ適用されるべきものです。それ以外の場合は BigInt のようなライブラリです。 ビッグナンバー , リーモンの BigInt または BigInteger . 今後、新しいネイティブの BigInt (注:Leemonのものではありません)が利用できるはずです。 クロミウム とそれをベースにしたブラウザ ( クローム は、新しい エッジ [v79+], ブレイブ ) と ファイアフォックス はすべてサポートしています。Safariはサポートが進行中です。

これにBigIntを使うとこうなる。 BigInt(n).toString()

const n = 13523563246234613317632;
console.log("toFixed (wrong): " + n.toFixed());
console.log("BigInt (right):  " + BigInt(n).toString());

ご注意 ただし、JavaScriptの数値(BigIntではない)として出力する整数が15〜16桁を超える場合(具体的に言うと Number.MAX_SAFE_INTEGER + 1 JavaScript の数値型 (IEEE-754 倍精度浮動小数点) は、それ以上の整数を正確に保持できないため、 [9,007,199,254,740,992] のように丸められることがあります。現在のところ Number.MAX_SAFE_INTEGER + 1 同様に、18,014,398,509,481,984で4の倍数、次に8、16、...となります)。

その結果、もしあなたが BigInt サポートに渡す文字列として数値を出力します。 BigInt 関数を使用します。

const n = BigInt("YourNumberHere");

const n1 = BigInt(18014398509481985); // WRONG, will round to 18014398509481984
                                      // before `BigInt` sees it
console.log(n1.toString() + " <== WRONG");
const n2 = BigInt("18014398509481985"); // RIGHT, BigInt handles it
console.log(n2.toString() + " <== Right");