求阶乘的和,输出不正确

输入N为20时
预期输出
2561327494111820313
实际输出
2561327494111820288

#include
int main()
{ int N,i;
double j=1,sum=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
    j=i*j;
    sum=sum+j;
}
printf("%.lf",sum);//输出从1!+2!+3!+...+N!的和
return 0;
}

#include <iostream>
using namespace std;

int main(){
    int n, sum = 0;
    int x = 1;
    cin >> n;
    
    for(int i=1; i<=n; i++){
        x *= i;
        sum += x;
    }
    
    cout << sum << endl;
    return 0;
} 

回答一下我自己
不一样是因为精度问题,定义数据用longlong