为什么我的置换计算器返回小数?

时间:2016-05-21 03:13:03

标签: javascript probability

我制作了一个排列和组合计算器。找到数字阶乘的代码是:

 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(),一切都有效,但我想找到问题的根源。

1 个答案:

答案 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的幂。