[解決済み】JavaScriptで大きな数の科学的記法を避けるには?
質問
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");
関連
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】JavaScript "Uncaught TypeError: object is not a function" 連想性の質問
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み] テスト
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み】 \u003C とは何ですか?