JavaScript toString限制

JavaScript toString限制,javascript,tostring,Javascript,Tostring,所以我的问题是,我正在写一个程序来检查这个数字是偶数还是奇数,不需要除法。所以我决定把这个数字变成一个字符串 number.toString() 方法。我遇到的问题是,如果你把一个大约17位或更长的数字放进去,字符串的前17位是正确的,那么它只是0,有时是2。比如说, function toStr (number) { return number.toString(10); } console.log(toStr(123456789123456789)); 印刷品 1234567

所以我的问题是,我正在写一个程序来检查这个数字是偶数还是奇数,不需要除法。所以我决定把这个数字变成一个字符串

number.toString()
方法。我遇到的问题是,如果你把一个大约17位或更长的数字放进去,字符串的前17位是正确的,那么它只是0,有时是2。比如说,

function toStr (number) 
{
    return number.toString(10);
}

console.log(toStr(123456789123456789));
印刷品

123456789123456780

有什么想法吗?

如果超出Javascript的最大整数大小(9007199254740992),那就是自找麻烦:

所以,要解决这个问题,必须将其视为一个字符串。然后提取字符串中的最后一个数字,并使用它来确定该数字是偶数还是奇数

if(parseInt(("123456789123456789").slice(-1)) % 2) 
 //odd
else
 //even

这个问题与字符串或函数无关。尝试转到控制台,只需输入表达式
1234567899123456789
,然后按回车键

同样,您将获得
123456789123456780

为什么?

JavaScript语言中的表达式
12345678989123456789
被解释为JavaScript数字类型,只能精确表示为以两个有效数字为基数的特定数字。当以基数2表示时,输入数字的有效位数恰好大于JavaScript表示数字时可用的基数2有效位数,因此该值在基数2中自动四舍五入,如下所示:

123456789123456789 =
  110110110100110110100101110101100110100000101111100010101 (base two)
123456789123456780 =
  110110110100110110100101110101100110100000101111100001100 (base two)
请注意,您可以在JavaScript中准确地表示一些大于某个大小的数字,但只有那些在基数2中没有比JavaScript更重要数字的数字才有空间。例如,2倍于非常大的10次方,在基数2中只有一个有效数字


如果将此程序设计为接受来自窗体或对话框的用户输入,则将以字符串形式接收输入。您只需要检查最后一个数字,就可以确定输入的数字是奇数还是偶数(假设它确实是一个整数)。另一个答案建议了获取字符串最后一个字符的标准方法,以及测试字符串值是奇数还是偶数的标准方法。

这是一个64位浮点数,使用IEEE 754规范。本规范的一个特点是,从2^53开始,两个数字之间的最小距离为2

var x = Math.pow(2, 53);
console.log( x == x + 1 );
此差异是的值,或ULP


这在原则上类似于在其他语言中尝试以整数类型存储分数值;像
.5
这样的值无法表示,因此它们被丢弃。对于整数,ULP值始终为
1
;对于浮点,ULP值取决于您试图表示的数字的大小。

这是一个数字限制,而不是字符串限制。为什么您的应用程序中需要这么大的数字?如果您使用number.toString(),它默认为base-10。否,number.toString(10)表示以base-10格式显示数字(与toFixed()或toPrecision()等舍入无关)。。。