我目前正在调查NodeJS中的一个小错误/意外行为。
调查包括通过.toString()
将数字转换为字符串
我注意到,对于满足n <= 1e21 (roughly)
的n,n被转换为具有完整形式的数字(比如999999999999999900000
),但是从n === 1e21
左右开始,.toString()
方法返回指数/科学记数法(a * 10 ^ b)。
这似乎与我测试的所有JS环境(Node,Chrome,Firefox)一致。
我认为它可能与Number.MAX_SAFE_INTEGER
有关但似乎没有任何联系。
这个门槛在哪里定义?什么是实际阈值,为什么是这个数字?
答案 0 :(得分:1)
经过多次挖掘,似乎这是在ECMAScript Language Specification中定义的。
当且仅当数字的绝对值大于或等于10 ^ 21或严格小于10 ^ -6时,数字将以指数格式呈现。
- (CRice)
完整的ECMA规范报价:
7.1.12.1 ToString应用于数字类型抽象操作
ToString将Number m转换为String格式,如下所示:
- 如果m是NaN,则返回字符串“NaN”。
- 如果m为+0或-0,则返回字符串“0”。
- 如果m小于零,则返回字符串“ - ”和ToString(-m)的字符串并置。
- 如果m为+∞,则返回字符串“Infinity”。
- 否则,令n,k和s为整数,使得k≥1,10k-1≤s<1。 10k,s×10n-k的数值是m,k小到 可能。请注意,k是小数位数 s的表示,s不能被10整除,而且最少 s的有效数字不一定由这些唯一确定 标准。
- 如果k≤n≤21,则返回由k的代码单元组成的字符串 s的十进制表示的数字(按顺序,没有前导 零),然后是n-k出现的代码单元0x0030(DIGIT 零)。
- 如果0 < n≤21,返回由代码单元组成的String s的十进制表示的最重要的n位数, 然后是代码单元0x002E(FULL STOP),然后是代码 s的十进制表示的剩余k-n个数字的单位。
- 如果-6&lt; n≤0,返回由代码单元0x0030组成的字符串 (DIGIT ZERO),然后是代码单元0x002E(FULL STOP),然后是 by -n出现代码单元0x0030(DIGIT ZERO),然后是 s的十进制表示的k位数的代码单位。
- 否则,如果k = 1,则返回由代码单元组成的字符串 s的单个数字,后跟代码单元0x0065(LATIN SMALL 字母E),后跟代码单元0x002B(PLUS SIGN)或代码 单位0x002D(HYPHEN-MINUS)根据n-1是正还是 否定,后跟十进制表示的代码单位 整数abs(n-1)(没有前导零)。
- 返回字符串 由最重要数字的代码单元组成 s的十进制表示,后跟代码单元0x002E(FULL STOP), 其次是小数的剩余k-1位的代码单元 表示s,后跟代码单元0x0065(LATIN SMALL LETTER E),然后是代码单元0x002B(PLUS SIGN)或代码单元0x002D (HYPHEN-MINUS)根据n-1是正还是负, 后跟代码单位的十进制表示 整数abs(n-1)(没有前导零)。
醇>