什么时候通过.toString()将数字转换为指数表示法?

时间:2018-03-27 21:59:48

标签: javascript

我目前正在调查NodeJS中的一个小错误/意外行为。

调查包括通过.toString()将数字转换为字符串 我注意到,对于满足n <= 1e21 (roughly)的n,n被转换为具有完整形式的数字(比如999999999999999900000),但是从n === 1e21左右开始,.toString()方法返回指数/科学记数法(a * 10 ^ b)。

这似乎与我测试的所有JS环境(Node,Chrome,Firefox)一致。

我认为它可能与Number.MAX_SAFE_INTEGER有关但似乎没有任何联系。

这个门槛在哪里定义?什么是实际阈值,为什么是这个数字?

1 个答案:

答案 0 :(得分:1)

经过多次挖掘,似乎这是在ECMAScript Language Specification中定义的。

  

当且仅当数字的绝对值大于或等于10 ^ 21或严格小于10 ^ -6时,数字将以指数格式呈现。
   - (CRice)

完整的ECMA规范报价:

  

7.1.12.1 ToString应用于数字类型抽象操作

     

ToString将Number m转换为String格式,如下所示:

     
      
  1. 如果m是NaN,则返回字符串“NaN”。
  2.   
  3. 如果m为+0或-0,则返回字符串“0”。
  4.   
  5. 如果m小于零,则返回字符串“ - ”和ToString(-m)的字符串并置。
  6.   
  7. 如果m为+∞,则返回字符串“Infinity”。
  8.   
  9. 否则,令n,k和s为整数,使得k≥1,10k-1≤s<1。 10k,s×10n-k的数值是m,k小到   可能。请注意,k是小数位数   s的表示,s不能被10整除,而且最少   s的有效数字不一定由这些唯一确定   标准。
  10.   
  11. 如果k≤n≤21,则返回由k的代码单元组成的字符串   s的十进制表示的数字(按顺序,没有前导   零),然后是n-k出现的代码单元0x0030(DIGIT   零)。
  12.   
  13. 如果0 < n≤21,返回由代码单元组成的String   s的十进制表示的最重要的n位数,   然后是代码单元0x002E(FULL STOP),然后是代码   s的十进制表示的剩余k-n个数字的单位。
  14.   
  15. 如果-6&lt; n≤0,返回由代码单元0x0030组成的字符串   (DIGIT ZERO),然后是代码单元0x002E(FULL STOP),然后是   by -n出现代码单元0x0030(DIGIT ZERO),然后是   s的十进制表示的k位数的代码单位。
  16.   
  17. 否则,如果k = 1,则返回由代码单元组成的字符串   s的单个数字,后跟代码单元0x0065(LATIN SMALL   字母E),后跟代码单元0x002B(PLUS SIGN)或代码   单位0x002D(HYPHEN-MINUS)根据n-1是正还是   否定,后跟十进制表示的代码单位   整数abs(n-1)(没有前导零)。
  18.   
  19. 返回字符串   由最重要数字的代码单元组成   s的十进制表示,后跟代码单元0x002E(FULL STOP),   其次是小数的剩余k-1位的代码单元   表示s,后跟代码单元0x0065(LATIN SMALL LETTER   E),然后是代码单元0x002B(PLUS SIGN)或代码单元0x002D   (HYPHEN-MINUS)根据n-1是正还是负,   后跟代码单位的十进制表示   整数abs(n-1)(没有前导零)。
  20.