问题描述
Javascript 何时会自动转换多个 e
表示法?对于一个修正的斐波那契数列:
function fibonacciModified(t1,t2,n) {
const T = Array(n).fill(0);
T[0] = t1;
T[1] = t2;
for(let i=2;i<T.length;i++) {
T[i] = T[i-2] + Math.pow(T[i-1],2);
}
return T;
}
const T = fibonacciModified(0,1,10);
console.log(T);
给出类似如下的输出:
表T
的最后一个数字,javascript决定自动将其转换为e
形式。 javascript 什么时候这样做?什么是触发点?我怎样才能将其转换回正常形式?
解决方法
在幕后,所有 javascript 数字都有效地以科学记数法存储(它们存储为双精度数)。这只是浏览器在您要求它向您显示数字时选择以不同方式显示数字。您可以详细了解如何实现 javascript 数字 here。我没有找到任何关于浏览器何时开始以科学记数法显示数字的权威资料。我不知道它是由标准定义的还是依赖于浏览器的,但我的浏览器 (Chrome) 在数字有 22 位时开始执行此操作。
如果您希望以不同格式显示数字,可以将其转换为字符串。 Number.toLocaleString() 有许多选项可让您根据自己的喜好调整其显示方式。例如:
> (1e25).toLocaleString('en-us',{ useGrouping: false })
"10000000000000000000000000"
我会警告说,数字的底层实现只能保持如此高的精度。当您开始处理大量数字时,您将失去一些准确性。
> 12345678901234567890
12345678901234567000
大于 Number.MAX_SAFE_INTEGER (9007199254740991) 的数字可能会由于其有限的二进制表示而开始失去精度。避免这种情况的方法是使用不同的数字类型 - BigInt。 BigInts 以不同的格式存储数字,允许它保存任意大的整数。 BigInt 文字是通过简单地在您的数字后面加上“n”来创建的,并且可以以多种类似于普通数字的方式使用(包括使用 .toString() 或 .toLocaleString() 的能力)
> 12345678901234567890n
12345678901234567890n
> (12345678901234567890n).toString()
'12345678901234567890'