JavaScript中没有区分整数和浮点数,一律按照浮点数处理,只能保存15位数字部分,其余为指数部分和正负符号。
所以,如果计算结果超过15位 ,则通常不能得到准确数字。
比如计算2的64次方:
document.write(Math.pow(2,64)+ '<BR>')
得到的结果是:18446744073709552000
准确数字应为:18446744073709551616
这说明即使整数运算,js也是作为浮点数运算的。超过科学计数法能保存的15位数字部分长度限制后,末尾的数字会被四舍去五入省略。因此无法计算出准确的2的64次方。js不能用于精确的科学计算。
一种变通方法:
document.write(Math.pow(2,64).toPrecision(50).toString().split(".")[0] + '<BR>')
得到的结果是:18446744073709551616
这说明,js是在最终打印数字到终端这一步才进行的舍入?还是说较长的表达式在计算时,内部做了简化合并?否则如果每计算一步得到结果舍入后再计算下一步的话,是不可能得到准确结果的,还没有toPrecision()就应该不准确了,无法挽回了。
不过,这种变通的方法仍没有解决的问题是:
超大结果的数字,如果toPrecision()中给定精度过小,会只得到科学计数法的整数位,只有一位数字。
例如:
document.write(Math.pow(2,128).toPrecision(23).toString().split(".")[0] + '<BR>')
得到的结果是:3