我制作了一个排列和组合计算器。找到数字阶乘的代码是:
function factorial(num){
total=1;
if(num==1||num==0){
return total;
}
else{
for(i=2;i<=num;i++){
total*=i;
}
return total;
}
}
以下是查找排列的代码:
answer.innerHTML="Answer: "+factorial(n)/factorial(n-r);
如果我做55P9我的回答是.5关。如果我使用Math.floor(),一切都有效,但我想找到问题的根源。
答案 0 :(得分:2)
它返回小数的原因是因为55因子(1.27 * 10 ^ 73)和46因子(5.50 * 10 ^ 57)被存储为浮点数,因为Javascript会自动将所有数字视为双精度浮点数。同时,因为它太大,所以由于浮点近似只是近似值,因此商中存在舍入误差。
在MATLAB中仔细检查:
>> factorial(55)/factorial(46)
ans =
2.3073e+15
>> ans - floor(ans)
ans =
0.5000
>> .5/(factorial(55)/factorial(46))
ans =
2.1670e-16
>> eps
ans =
2.2204e-16
正如您在这里看到的,由于浮点精度误差,MATLAB得到了相同的结果。因此,.5是该计算所期望的绝对误差,因为它应该是2的幂。