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。素晴らしいです
- 次に、上述した動作は、計算が終了するまで繰り返されます。
注意:
~是按位取反的意思,计算机里面处理二进制数据时候的非,~~就是再转回来,利用两个按位取反的符号,进行类型的转换,转换成数字符号。