を差し引いた長さ数にjavascript
-
20-09-2019 - |
質問
なぜq==0以下のスクリプト?
<script>
var start = 1234567890123456789;
var end = 1234567890123456799;
var q = end - start;
alert(q);
</script>
うにすべき10.何が正しい道を引くこれら二つの番号?
解決
JavaScriptでの数字は、浮動小数点をしているため。彼らは、精度が制限されています。
JavaScriptは非常に長い番号を見ているときに、それはそれは、64ビット浮動小数点として表現できる最も近い数値に丸めます。スクリプト、start
とend
で同じ値に丸めます。
alert(1234567890123456789); // says: 1234567890123456800
alert(1234567890123456799); // says: 1234567890123456800
があり大きな整数上の正確な計算を行うには、組み込みの方法はませんが、あなたは、このような<のhref = "http://www-cs-students.stanford.edu/~tjw/jsbn/としてBigIntegerのライブラリを使用することができます"REL =" noreferrer ">この1 のます。
他のヒント
ジェイソンはすでに、なぜ掲載しました。 // WWW-:ソリューションについては、でhttpのJavascriptのBigIntライブラリーを得ることができますcs-students.stanford.edu/~tjw/jsbn/する
const subtract = (a, b) => [a, b].map(n => [...n].reverse()).reduce((a, b) => a.reduce((r, d, i) => {
let s = d - (b[i] || 0)
if (s < 0) {
s += 10
a[i + 1]--
}
return '' + s + r
}, '').replace(/^0+/, ''))
すべての異なるテストケースを処理するように
より良い
これらの事のために大きな整数のライブラリを使用します。
これはちょうどあなたが使用することができ、一般的な場合である....
で分かりやすく説明している JavaScriptの文書:
によるとECMAScript標準的な数種類: の倍精度の64ビットのバイナリ形式IEEE754値 (数字の間に
-(2
53
-1)
や2
53
-1
). ありません特定の型の整数です。
Wikipediaページ約 倍精度浮動小数点フォーマット 説明:
との間
2
52
= 4,503,599,627,370,496
や2
53
= 9,007,199,254,740,992
のrepresentable数の整数です。次の範囲から2
53
へ2
54
, のものを乗じた2
, ので、representable数のものも。
(すべての整数値より小さい 2
52
れます。)
1234567890123456789
や 1234567890123456799
より大きい 2
60
= 1152921504606846976
.この大きさの約1%の整数値が格納されそうに倍精度浮動小数点形式です。
これら二つの保管することはできません。そのことは四捨五入で表示す 1234567890123456800
.
の JavaScriptの文書 もーについて教えてくれる整数型数値が格納されう:
[...]および始めとECMAScript6に行いますが、チェック数を倍精度の浮動小数点数が可能となります。
Number.isSafeInteger()
などNumber.MAX_SAFE_INTEGER
やNumber.MIN_SAFE_INTEGER
.この範囲を超えて整数にJavaScriptは安全ではありませんもうとする倍精度の浮動小数点近似値です。