日期:2014-05-16  浏览次数:20519 次

javascript 问题求解

有一个数组,数组长度为100,其中每个数组成员都是正整数,且数值都很大,其中最大值为   12   位正整数,要求先对每个数组成员求平方,再全体求和。

要求用   javascript   来做,问题是如何保证运算精度




------解决方案--------------------
关注精度问题。
------解决方案--------------------
先除以一个整数,然后计算后再乘回来,这样保证不会溢出,但是要注意保留小数的位数,因为IEEE754浮点数标准,计算会带很长的小数,小数位数太多会极其影响计算效率,所以要保留除以的那个整数位数的多一位。
举个例子,因为100个数不好知道计算结果,所以先放3个
手工计算的结果是
a的平方 23541904
b的平方 20866624
c的平方 72658576
三数相加正好等于117067104和下数计算结果一致
<script language=javascript>
var a=new Array(4852,4568,8524)
var result=0;
for(var i=0;i <a.length;i++)
{
result=parseFloat(result)+parseFloat(Math.pow(a[i]/1000,2).toFixed(7));
}

alert(Math.round(result*1000000))
</script>

上面的计算结果正好等于预期结果测试通过
言归正传,楼主的100个数,再举一个例子
比如100个数全部是楼主的12位最大值9999 9999 9999,这样便于计算最后的结果是否正确
因为9999 9999 9999的平方是9999 9999 9998 0000 0000 0001
先把常规方法列出来
<script language=javascript>
var a=new Array()
for(var i=0;i <100;i++){
a[i]=999999999999
}
var result=0;
for(var i=0;i <a.length;i++)
{
result=parseFloat(result)+parseFloat(Math.pow(a[i],2));
}

alert(parseInt(result))
</script>
结果出来的数据结果是9,一眼就能看出严重不对
但是
用这个方法求出来的数据
<script language=javascript>
var a=new Array()
for(var i=0;i <100;i++){
a[i]=999999999999
}
var result=0;
for(var i=0;i <a.length;i++)
{
result=parseFloat(result)+parseFloat(Math.pow(a[i]/1000,2).toFixed(7));
}

alert(Math.round(result*1000000))
</script>
虽然是科学记数的数,但是值可以看得出来差不多是准确的
<script language=javascript>
var a=new Array()
for(var i=0;i <100;i++){
a[i]=999999999999
}
var result=0;
for(var i=0;i <a.length;i++)
{
result=parseFloat(result)+parseFloat(Math.pow(a[i]/1000,2).toFixed(7));
}

alert(Math.round(result*1000000))
</script>

------解决方案--------------------
不会这个方面> . <
斑竹大人。。
这种值999999666666科学记数会出问题滴。。它的值取的不准。。