整数整数とJSの最大の安全性

参考:
https://segmentfault.com/a/1190000002608050

最大のセキュリティ整数JSはどのくらいですか?

すべての数値型JS、実際には8バイトで保存されている倍精度浮動小数点表現。倍精度浮動小数点の範囲は、偉大な範囲を探しますが、フロートは、正確にすべての数字を表現することができません:2.23x10^(-308) ~ 1.79x10^308大きくなることが示されることができるが、正確に演算を使用して表すことができる最大の整数はそれほど大きくありません。

また実際、このような単純な加算は間違って次のようになります。

console.log(0.1 + 0.2)
//output: 0.30000000000000004

したがって、安全に使用することができるシンボルJS 固定 64ビット環境でのような他の言語とは異なり、(ここでは、安全に算術の範囲に使用されることを意味することに留意されたい)大きい整数。

2^63 - 1;//9223372036854775807

しかし

Math.pow(2, 53) - 1     // 9007199254740991

JS最大と安全性の最小値は、によって得ることができます。

console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991

これは、操作の値が危険であるよりも大きい理由を次の例では、あなたが理解します:

var x = 9223372036854775807;
console.log(x === x + 1);// output: true
console.log(9223372036854775807 + 1000); //output: 9223372036854776000

彼らは失う精度の浮動小数点演算を実施しているため、これらの操作は、エラーの結果です。

なぜ、この値はありますか?

次のように二重のフローティング構造は次のようになります。

16075459-ffaaca9760cb0c8d.png
image.png
  • 符号ビット
  • 11ビットの指数
  • 52ビットの仮数

52の数の整数部分を使用して、最大の可能な数の正確な表現であるべきで2^52 - 1、それはときに64ビットの整数表現で行ったように、魚類:2^63 - 1(マイナス符号ビット)。しかし、浮動小数点数に保存されている実際には例えば、小数では、正規化処理を行います。

20*10^2 => 2*10^3 //小数点前只需要保留 1 位数

正規化は、常にされた後、バイナリの場合は、小数点の前に1は、1.***1ビットを保存し、これは保存する必要はありません。

大きな整数を処理する方法

、開発バックエンドのために、より多くのアプリケーションをNodejsこのオーバーフローの問題に対処するための必然的な必要性が、幸いな問題を解決するには、いくつかの良いサードパーティのライブラリがあります。BIGNUMBIGINTは

大きな整数データベース

MySQLは次のように各範囲を整形する扱うことができます

//每种类型的第二行为无符号范围
TYPE         BYTE   MIN            MAX
TINYINT      1     -128            127
                                   255
SMALLINT     2    -32768          32767
                                  65535
MEDIUMINT    3    -8388608       8388607
                                 16777215
INT          4   -2147483648    2147483647
                                4294967295
BIGINT       8  -9223372036854775808    9223372036854775807
                                       18446744073709551615

BIGINTデータ量を処理すると、整数64ビットを超えるBIGINT、記憶することができる範囲が格納されている文字列の使用を考慮する必要があり、欠点は、データベースに頼ることはできないアプリケーションを介して大きな整数のライブラリを使用してデジタル演算処理の必要性があります。

注:BIGINTは、多くの場合、(5)またはINT(10)のみブラケット5または幅図10に必要なメモリのバイトの範囲と数の精度に影響を与えないとVARCHAR(100)またはDECIMAL(10、参照別2)領域

どのように計算の必要な精度に対処するには?

操作性のタイプに言及する場合、一般的にビット数がオーバーフローしないが、背高精度。必要な値を保存するデータベースDECIMALNUMERIC精度の損失を防止するために、格納されたフィールドタイプと同じように入力)。

慎重に操作をシフト

使用することができる整数の安全範囲を議論したが、シフト操作を行う際に注意してください:変位動作を、それが整数32ビット符号付き整数に切り捨てられます。それは間違った値を取得します。このシフト操作の範囲を超えています。例えば:

196 << 24;// 输出: -1006632960 正确应为: 3288334336

いくつかのヒント変位を突くことができます- > こちら

深い読み

コードの謎(4) - (考える驚きから)フロート

ます。https://www.jianshu.com/p/05395ded2569で再現

おすすめ

転載: blog.csdn.net/weixin_33862041/article/details/91261552