競プロなどで Javascript を採用していると、稀にロジックは正しいはずなのにクリアしない時がある。
これは、Number 型で定義されている「Number.MAX_SAFE_INTEGER
より大きい」または「Number.MIN_SAFE_INTEGER
より小さい」数値で演算されており、丸め誤差が発生している可能性が高い。
これを解決するには BigInt 型を使用すると良い。(var の自動変換に BigInt が含まれていない為、今回のようなエラーが表示される)
しかし、使用するにあたって直感的に使用できなかったので使い方を備忘録程度に記載しておく。
#宣言方法#
BigIntの宣言方法は、2通り存在する。
①代入する数値に n を追記する。
②代入する数値の型を設定する。
//①
var a = 0n;
//②
var b = BigInt(before_BigInt);
#演算方法#
2021年1月時点では BigInt に Math などの演算パッケージが対応しておらず、基本的な演算子(+,-,*,/,%)
のみが使用可能な演算子となっている。
その為、小数点切り捨てなどは以下のように記述するなど工夫が必要になる。
また、BigInt の演算及び比較は BigInt 同士である必要がある。
他の型が含まれているとTypeError: Cannot mix BigInt and other types, use explicit conversions (BigInt と他の型を一緒に使うことは出来ません)
が表示される。
// value を 100 で割った時の商を算出する。
var floor = (value - (value % 100n)) / 100n;
//@il9437 さんのコメントを参照お願いします。(2020.01.04 追記)
var floor2 = value / 100n;
#最後に#
Java などには long があったり、パッケージが発展してたりするので競プロのシーンでは Javascript はあまり向かないのかもしれない。そもそも、実際のシステムで Number の許容桁数をオーバーする数値を運用したことがないのでニッチかもしれない。
そんな中で、この記事を読んで少しでも解決のきっかけになれば最高です。
MDN Web Docs を参照:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt