JS - 大きな整数追加します

JSといずれかの言語、その値の範囲が限られています。

Number.MAX_VALUE // 1.7976931348623157e + 308
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_VALUE // 5E-324
Number.MIN_SAFE_INTEGER // -9007199254740991

我々は一般的な形式を大整数(> Number.MAX_SAFE_INTEGER)加算演算したいのですが、出力したい場合は、図には直ちに指数表記に変換されるNumber.MAX_SAFE_INTEGER数を超えると、その後、+を達成することができない使用して、数値精度の誤差が以前に比べ。この時点で、我々はまた、アルゴリズム自体のセットを実装する必要があります。

function sumBigNums(a,b){
   let carry = 0, res = ' ';
   a = a.split("");
   b = b.split("");
   while(a.length || b.length || carry){
        carry += ~~a.pop() + ~~b.pop();
        res = (carry%10) + res;
        carry = carry > 9;
   }
   return res.replace(/^0+/, '');

}

コードのアイデア:

  • 変更は、その数学的表現では発生しないことを確実にするために、多数を保持する文字列との最初の
  • 初期化解像度は、すべての計算のために、二つの文字列の配列に分割、中間計算の結果を保持する変数を運びます
  • 最初のサイクルの動作は、各桁が0であるため、2つの最後尾の二つの数字で、「ビット」が行われる - 9ので、キャリーの必要性、動作中に残りを引き継ぐ後、結果は、ビットに残ります。
  • 10より大きいがtrueの場合、一時は割り当てられます、というように、なぜ心配しないで、ブール値を割り当てる必要があり、一時かどうかを判断するために、魔法が起こるしようとしています。
  • 次のサイクルのために、存在する前に2つの操作の後にデジタル演算の多数に参加しなかった、又はキャリーが発生します。
  • 暗黙の変換Jsとがありますので、二つの数字を加えた新たな一時を加えて、キャリーの最後に出現する場合は、一時は、この時点で本当である、それがtrueに変換され、我々はのJSキャストを借ります完成した論理演算にすべての10。素晴らしいです
  • 次に、上述した動作は、計算が終了するまで繰り返されます。

注意:
~是按位取反的意思,计算机里面处理二进制数据时候的非,~~就是再转回来,利用两个按位取反的符号,进行类型的转换,转换成数字符号。

おすすめ

転載: www.cnblogs.com/sunidol/p/11528300.html