所以我的问题是这个,我正在编写一个程序来检查数字是偶数还是奇数而没有除法。所以我决定取数字,用
把它变成一个字符串number.toString()
方法。我遇到的问题是,如果你输入的数字大约是17位或更长,那么字符串对于前17位数字是正确的,那么它只是0,有时是2&#39 ; S。例如,
function toStr (number)
{
return number.toString(10);
}
console.log(toStr(123456789123456789));
打印,
123456789123456780
任何想法?
答案 0 :(得分:3)
问题与字符串或函数完全无关。尝试转到您的控制台,只需输入表达式123456789123456789
并按回车。
您同样会获得123456789123456780
。
为什么?
JavaScript语言中的表达式123456789123456789
被解释为JavaScript数字类型,它只能精确地表示为一定数量的基本两位有效数字。输入数字在用基数2表示时恰好具有更多有效数字,而不是数字表示JavaScript中表示的基数两位有效数字的数字,因此该值在基数2中自动舍入如下:
123456789123456789 =
110110110100110110100101110101100110100000101111100010101 (base two)
123456789123456780 =
110110110100110110100101110101100110100000101111100001100 (base two)
请注意,您可以在JavaScript中准确地表示大于某个大小的某些数字,但只有那些在基数为2的数字中没有比JavaScript更重要的数字才有空间。例如,10倍的非常大的功率的2倍,在基数2中只有一个有效数字。
如果您正在设计此程序以接受来自表单或对话框的用户输入,那么您将以字符串形式接收输入。您只需要检查最后一位数字,以确定输入数字是奇数还是偶数(假设它确实是一个整数开头)。另一个答案提出了获取字符串最后一个字符的标准方法,以及测试字符串值是奇数还是偶数的标准方法。
答案 1 :(得分:1)
如果超出Javascript的最大整数大小(9007199254740992),则会遇到麻烦:http://ecma262-5.com/ELS5_HTML.htm。
因此,要解决此问题,您必须将其视为字符串。然后提取字符串中的最后一位数字并使用它来确定该数字是偶数还是奇数。
if(parseInt(("123456789123456789").slice(-1)) % 2)
//odd
else
//even
答案 2 :(得分:0)
它是一个64位浮点数,使用IEEE 754规范。该规范的一个特征是从2 ^ 53开始,两个数字之间的最小距离为2。
var x = Math.pow(2, 53);
console.log( x == x + 1 );
此差异是unit in the last place或ULP的值。
原则上类似于尝试将分数值存储在其他语言的整数类型中;像.5
这样的值无法表示,因此它们会被丢弃。对于整数,ULP值始终为1
;浮点数,ULP值取决于您尝试表示的数字的大小。