javascript - JavaScript 的整数加法问题
问题描述
我们目前正在实验室学习 JavaScript,我们刚刚创建了一个简单的 Fibonacci 函数来计算 Fibonacci 序列的前 100 个数字。
function fibo(stop) {
let counter = 0;
let first = 1;
let second = 1;
let third = 0;
console.log(third);
console.log(second);
console.log(first);
while (true) {
third = second;
second = first;
first = second + third;
counter++;
if (counter >= stop) {
break;
}
console.log(first);
}
}
fibo(100);
现在,当我运行它时,有一个部分只是神奇地将数字加在一起是错误的。
当我在 JavaScript 中分别将这两个数字相加时,我得到的答案与屏幕截图中的第三行相同。但是,当我在计算器上重做添加时,它显示14 472 334 024 676 221
而不是14 472 334 024 676 220
. 我的第一个猜测是它与整数溢出有关,但又是 log2(14472334024676220) = 53.684... 这意味着在 64 位整数中它没有溢出。为什么会这样?它从何而来?我试着问我的老师,但他不知道。
解决方案
处理整数时,最大安全整数(即 n + 1 !== n)9007199254740991
是 2^53 - 1
Javsacript 数字是 64 位浮点数,这并不意味着整数
使用 BigInts - 初始化一个 BigInt 你可以使用n
如下数字的后缀
function fibo(stop) {
let counter = 0;
let first = 1n;
let second = 1n;
let third = 0n;
console.log(third.toString());
console.log(second.toString());
console.log(first.toString());
while (true) {
third = second;
second = first;
first = second + third;
counter++;
if (counter >= stop) {
break;
}
console.log(first.toString());
}
}
fibo(100);
注意: Stack Snippet console.log 无法记录 BigInt 这就是我将.toString()
推荐阅读
- powerquery - 后续合并后从 List.Dates 合同展开的列
- django - 如何在 Django 中创建预保存信号?
- python - Ansible:更改剧本位置
- python - 使用 np.random.normal 创建一个矩阵
- python - 为什么我不能在 anaconda jupyter notebook 中导入包?
- kubernetes - 无法在 kubernetes 中为负载均衡器使用服务名称
- python - 如何翻译熊猫专栏
- python - SQLAlchemy 中的抽象混合属性
- c - EOF 是 C 中的文件结尾,但我怎样才能写文件的开头?
- php - 您能否保留使用 ajax 的页面的动态内容,以便在用户返回时恢复?