【问题标题】:JavaScript toString limitsJavaScript toString 限制
【发布时间】:2014-05-17 02:10:02
【问题描述】:

所以我的问题是,我正在编写一个程序来检查数字是偶数还是奇数而没有除法。所以我决定取这个数字,用

把它变成一个字符串
number.toString()

方法。我遇到的问题是,如果您输入的数字长度约为 17 位或更多位,则该字符串的前 17 位数字是正确的,那么它只是 0,有时是 2。例如,

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

console.log(toStr(123456789123456789));

打印,

123456789123456780

有什么想法吗?

【问题讨论】:

  • 这是数字限制,不是字符串限制
  • 为什么你的应用需要这么大的数字?
  • 如果你做 number.toString(),它默认为 base-10。
  • 不,number.toString(10) 表示以 10 为底的格式显示数字(与 toFixed() 或 toPrecision() 之类的舍入无关)...

标签: javascript tostring


【解决方案1】:

问题与字符串或您的函数完全无关。尝试转到您的控制台并输入表达式 123456789123456789 并按回车键。

您同样会获得123456789123456780

为什么?

JavaScript 语言中的表达式123456789123456789 被解释为JavaScript 数字类型,它只能精确地表示为以两位为基数的有效数字。以二为底表示的输入数字恰好比 JavaScript 数字表示中可用的以二为底的有效数字的数量多,因此该值以二为底自动四舍五入,如下所示:

123456789123456789 =
  110110110100110110100101110101100110100000101111100010101 (base two)
123456789123456780 =
  110110110100110110100101110101100110100000101111100001100 (base two)

请注意,您可以在 JavaScript 中准确地表示 一些 大于特定大小的数字,但只有那些以 2 为底的有效数字不超过 JavaScript 空间的数字。例如,2 乘以 10 的非常大的幂,这将只有 一个 以 2 为底的有效数字。

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

【讨论】:

    【解决方案2】:

    如果您超出了 Javascript 的最大整数大小 (9007199254740992),您就是在自找麻烦:http://ecma262-5.com/ELS5_HTML.htm

    所以要解决这个问题,你必须只把它当作一个字符串。然后提取字符串中的最后一位数字,并用它来判断该数字是偶数还是奇数。

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

    【讨论】:

      【解决方案3】:

      这是一个 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 值取决于您尝试表示的数字的大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多