javascript大数运算

来源:互联网 发布:原生实现双向数据绑定 编辑:程序博客网 时间:2024/06/15 22:09
当数字超过15位相加的时候会出现科学计数法 精度就成了问题 如果还有小数也是.例如:9999999999*999999999用javascript计算就不会得到9999999989000000001结果。在网上查找相关资料都没有得到满意的答案,经过自己思考,终于找到了一个满意的解决大数运算问题的方法,下面我说说我的思路。以下内容中的位数假定右前左后。 9999999999*999999999可以分解成(9999990000+9999)*(999990000+9999)=9999990000*999990000+9999990000*9999+9999*999990000+9999*9999,那么我们可以先得到9999999999*999999999的前8位数,根据上面的因式分解,显然9999999999*999999999和9999990000*9999+9999*999990000+9999*9999的前8位数是一致的。9999*9999=99980001那么9999990000*9999+9999*999990000+9999*9999的前4位数是‘0001’。那么9999990000*9999+9999*999990000+9999*9999结果的4位后的值就是999999*9999+9999*99999+9998=10998890000。‘10998890000’与‘0001’拼接得到‘109988900000001’这样9999999999*999999999的前8位是‘00000001’。因为9999999999*999999999=9999990000*999990000+9999990000*9999+9999*999990000+9999*9999=9999990000*999990000+109988900000001那么9999999999*999999999结果前8位后的数就是999999*99999+1099889=99999999890,‘99999999890’与‘00000001’拼接得到‘9999999989000000001’,这是不是我们想要的结果呢? 上边的数字有些特殊,但是基本原则是一致的,基本思路就是通过我们初中学到的因式分解可以把运算的结果分段得到,然后进行字符串拼接。例如:234567783347*8734355345可以分解成(234567000000+783347)*(8734300000+55345),在实际项目中分解的位数可以根据项目需要定义为定数。如果运算数字太大可以进行多次分解。通过此方法也可以进行乘方运算。 初次写博,先说到这,希望以上内容对大家解决类似问题有所帮助,代码我就不写了,不足之处欢迎各位同行来指正。