JavaScript实现大数的运算

当JavaScript中的数字超出安全整数范围时,可以使用字符串和科学记数法进行大数运算。文章提供了一个通过转换为字符串和数组进行加法运算的方法,适用于大整数情况,最后将结果转换回科学记数法表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js的' MAX_SAFE_INTEGER '是9007199254740991,而' MIN_SAFE_INTEGER '是-9007199254740991。那么如何实现一些特大数加法呢?今天就来讨论一下。

对于非常大或非常小的数字,浮点值可以用科学记数法来表示。使用科学记数法,您可以将一个数表示为一个数加上e/E,后跟10的倍数,例如:

复制代码如下:

var num1=3.125e7//31250000 var num 2=3e-17;//0.00000000000000003

极大数字的加法和减法可以通过使用字符串科学记数法来执行,例如:

复制代码如下:

//这里只考虑大整数的情况,不考虑十进制函数strAdd(sNum1,sNum2){)

/*加一位,记录最高位输入一位的情况*/

var sNum1=['0 ',sNum1]。join('),sNum2=['0 ',sNum2]。联接(“”);

/*向短数字字符串添加0 */

var len1=sNum1.length,len2=sNum2.length,

zeroArr=function(len){

var arr=新数组(len),i=len

while(I-){ arr[I]=0;}

返回arr

};

if(len1 len2){

var arrTemp=zero arr(len 1-len 2);

arrTemp.push(sNum2),

snu m2=arr temp . join(');

}

else if(len2 len1){

var arrTemp=zero arr(len 2-len 1);

arrTemp.push(sNum1),

snu m1=arr temp . join(');

}

/*将字符串转换为数组,并将其与相应的数字相加*/

var arr1=sNum1.split('),arr 2=snum 2 . split(');

var arrAddRes=新数组(arr1.length),I=arr 1 . length;

Var andone=0,//低阶和是否加到一个cur1,cur2,curAdd

while(i - ){

cur1=arr1[i],cur 2=arr 2[I];

curAdd=cur1 cur2 andone

if(10 curAdd)

arrAddRes[i]=curAdd,

andone=0;

其他

arrAddRes[i]=curAdd.toString()。切片(1,2),

andone=1;

}

如果(!and){//是否输入最后一个,否则截取前面的0 arrAddRes.splice(0,1);

}

/*数组截断的前19位(如果有)使用科学记数法来表示此结果*/

var keeplen=19//js的小数只保留小数点后18位var ea after=arraddres . length-1;//e下面的多部分变量eBefore,ebe forestr=“”;//e前面的小数部分

if(keeplen arrAddRes.length)

eBeforeStr=[arrAddRes[0],'.',arrAddRes.slice(1,keeplen)。join(')]。联接(“”);

其他

eBeforeStr=[arrAddRes[0],'.',arrAddRes.slice(1)。join(')]。联接(“”);

eBefore=eBeforeStr

return [Number(arrAddRes.join(')),eBefore,e after];

}

strAdd('1234567890 ',' 9876543210 ');//- [1111111100, 1.1111111, 9]

代码如上,是不是也很简单?

原文地址:,,JavaScript实现大数的运算_菜鸟教程之家

本文来自网络,不代表菜鸟教程之家立场,转载请注明出处。

本版中只有一个用于生产环境的文件:BigDecimal-all-last.min.js小为26K,如果WEB服务器打开GZIP压缩,可以减小至7K,如需完整版本请移步至:http://download.youkuaiyun.com/detail/aquaqu2009/4575230 简单用法: var scale = 20; var e = new BigDecimal("0"); var denominator = new BigDecimal("1"); var eBefore = new BigDecimal("-1"); var iteration = 1; while (!e.equals(eBefore)) { eBefore = e; e = e.add(BigDecimal.prototype.ONE.divide(denominator, scale, BigDecimal.prototype.ROUND_HALF_UP)); denominator = denominator.multiply(new BigDecimal(iteration+'')); ++iteration; } equal(e.toString(), "2.71828182845904523536"); ok(new BigDecimal("1234.5678").isPositive(), "1234.5678 is positive"); ok(new BigDecimal("-1234.5678").isNegative(), "-1234.5678 is negative"); ok(!BigDecimal.prototype.ZERO.isPositive() && !BigDecimal.prototype.ZERO.isNegative(), "BigDecimal.prototype.ZERO is neither positive nor negative"); ok(BigDecimal.prototype.ZERO.isZero(), "BigDecimal.prototype.ZERO is zero"); ok(new BigDecimal("1234.0000").isLessThan(new BigDecimal("1234.5678")) && new BigDecimal("1234.0000").isLessThanOrEqualTo(new BigDecimal("1234.5678")), "1234.0000 is less than 1234.5678"); ok(!new BigDecimal("1234.0000").isGreaterThan(new BigDecimal("1234.5678")) && !new BigDecimal("1234.0000").isGreaterThanOrEqualTo(new BigDecimal("1234.5678")), "1234.0000 is not greater than 1234.5678"); ok(new BigDecimal("1234.5678").isGreaterThan(new BigDecimal("1234.0000")) && new BigDecimal("1234.5678").isGreaterThanOrEqualTo(new BigDecimal("1234.0000")), "1234.5678 is greater than 1234.0000"); ok(!new BigDecimal("1234.5678").isLessThan(new BigDecimal("1234.0000")) && !new BigDecimal("1234.5678").isLessThanOrEqualTo(new BigDecimal("1234.0000")), "1234.5678 is not less than 1234.0000"); ok(new BigDecimal("1234.5678").isLessThanOrEqualTo(new BigDecimal("1234.5678")) && new BigDecimal("1234.5678").isGreaterThanOrEqualTo(new BigDecimal("1234.5678")), "1234.5678 is less than or equal to itself as well as greater than or equal to itself"); 别整个复制粘贴啊,那样是运行不起来的,请粘贴您需要的代码,,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值