JavaScript中如何精确计算和表示大整数

Javascript不能精确表示大整数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值