减去长的数字在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
有没有内置的方式来做大整数精确运算,但你可以使用一个BigInteger库如的这一项。
其他提示
杰森已经张贴为什么。 // WWW-:解决的办法,你可以在 HTTP GET一个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文件:
根据写标准,只有一个号码类型: 双精64位的二元格式IEEE754值 (之间的数字
-(2
53
-1)
和2
53
-1
). 没有具体类型的整数。
维基百科的网页有关 双精度浮点格式 解释说:
之间
2
52
= 4,503,599,627,370,496
和2
53
= 9,007,199,254,740,992
这可表示的数字是准确的整数。对于下一步的范围,从2
53
要2
54
, 一切都是乘2
, ,因此可表示的数字是的甚至是那些等。
(所有整数比较小 2
52
表示完全一致。)
1234567890123456789
和 1234567890123456799
比 2
60
= 1152921504606846976
.在这个幅度是只有约1%的整的数字存储完全使用双精度浮点的格式。
这两个不能被存储。他们都被四舍五入到 1234567890123456800
.
的 JavaScript文件 也解释了如何告诉我们,如果一个整数被保存究竟:
[...]开始写6,你也是能够检查,如果一些是在双精度浮点数范围内使用
Number.isSafeInteger()
以及Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
.超出这个范围内,整数在JavaScript不再安全,将是一个双精度浮点的近似值。