如何计算超出精度数字的加减运算

使用javascript计算如下的结果:

63298532574392574384 + 1 = ?

结果:63298532574392570000

为什么会出现这种情况呢?不应该是63298532574392574385吗?这引发了我的思考

得到结果后可以看出,直接处理肯定是不行了。因为这段数字超出了Number数据类型的精度,javascript 不能存这么长的数字。如果必须运算的话那只能通过其他的方式来代替,那么该如何解决这个问题呢?

一、字符串处理方式

回想javascript的基本类型,能存储任意长度的内容只有字符串类型了。基于这个想法的话,就需要把Number类型转化成字符串类型使用,使用 toString() 方法可以转化成字符串,把字符串分割成两部分,然后用后面的一段转化成number类型去加1,最后再转换成字符串和第一段自负串链接起来。

var num = "63298532574392574384"

var str1 = num.substring(0,10)

var str2 = num.substring(10)

var str3 =parseInt(str2) + 1

var str = str1 + str3        // "63298532574392574385"


虽然说能解决这个问题,但是存在几个问题:

  1. 在何处截取字符串?
  2. 如果截取字符串的地方存在进位怎么办?

这都是有可能存在的,显然不能推广使用。


二、转化成数组处理

我相信你看到标题就应该能想到,基于第一段的处理方式把字符串截成两节,如果是很长呢?这样截取显然不行,那只能回到最初的,把字符串的每个字母都截取存放在一个数组中。使用最后一个数字去加一但是这里要考虑到进位操作。直接上代码:

var num = "63298532574392574384" var arr = num.split(''); var newNum = calculate(arr).join('')        // 63298532574392574385

function calculate(arr){ var last; if (arr.length == 0) { last = 0; }else{ last = arr.pop(); } if (last == 9) { last = 0; arr = calculate(arr); }else{ last = last - 0 + 1; //转化成数字 } arr.push(last); return arr; }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DisFney

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值