本文實(shí)例講述了JavaScript實(shí)現(xiàn)計(jì)算圓周率到小數(shù)點(diǎn)后100位的方法。分享給大家供大家參考,具體如下:

專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)上高免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
浮點(diǎn)數(shù)的有效數(shù)位是16位,我自己做了一個(gè)大數(shù)類,能存儲(chǔ)100位有效數(shù)位,并實(shí)現(xiàn)了大數(shù)類的基本運(yùn)算。我用它來(lái)計(jì)算圓周率(割圓法,即多邊形逼近),得到了小數(shù)點(diǎn)后一百位有效數(shù)字,比對(duì)了Machin 公式的計(jì)算結(jié)果,沒有誤差。用時(shí)約2秒。
完整示例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>www.jb51.net js計(jì)算圓周率</title>
</head>
<body>
<script>
<!--
function BigNum(str, n, b)
{
/*
BigNum -- 大數(shù)類
私有成員:
data -- 119 位數(shù)字,放在長(zhǎng)度為 17 的數(shù)組里,每個(gè)數(shù)組元素存放 7 位數(shù)字。
decimal_place -- 小數(shù)點(diǎn)的位置,從最左位開始算。
positive -- 是否是正數(shù)。
recalc() -- 為了盡可能存放最多的有效數(shù)位,去除前綴的 0,并重新計(jì)算小數(shù)點(diǎn)位置。
init() -- 部分初始化工作。
公有成員:
BigNum( String str, INT n, BOOL b) --
構(gòu)造函數(shù)。參數(shù):str -- 字符串,各個(gè)有效數(shù)位;n -- 整數(shù),小數(shù)點(diǎn)位置,從最左位開始算,比如 BigNum("123", 2) = 12.3; BigNum("123", 0) = 0.123; BigNum("123", -2) = 0.00123;b -- 布爾值,是否是正數(shù)。
Add( BigNum num ) -- 加法。
Subtract( BigNum num ) -- 減法。
Multiply( BigNum num ) -- 乘法。
Divide( BigNum num ) -- 除法。
SquareRoot() -- 平方根。
toString() -- 轉(zhuǎn)換為字符串(包括小數(shù)點(diǎn)),以便以文本形式輸出計(jì)算結(jié)果。
Clone() -- 復(fù)制。
*/
this.recalc = function() /* 去除前綴的 0,并重新計(jì)算小數(shù)點(diǎn)位置 */
{
for(var i = 0; i < 17; i ++)
{
if(this.data[0] != 0) break;
this.data.shift();
this.data.push(0);
this.decimal_place --;
}
}
this.init = function() /* 部分初始化工作 */
{
this.decimal_place = Math.ceil( n / 7 ); //小數(shù)點(diǎn)位置
this.data = new Array(17); //保存有效數(shù)位的數(shù)組
if(n % 7 > 0)
{
var arr = new Array( 8 - n % 7 );
}
else
{
var arr = new Array( 1 - n % 7 );
}
str = arr.join("0") + str;
if(str.length > 119)
{
str = str.substr(0, 119);
}
else if(str.length < 119)
{
var arr = new Array(120 - str.length);
str += arr.join("0");
}
for( var i = 0; i < 17; i ++ )
{
this.data[i] = parseInt( str.substr(i * 7, 7) , 10 );
}
}
/* 初始化開始 */
this.positive = b;
if( ! /^0*$/.test(str) )
{
this.init();
this.recalc();
}
else
{
this.data = new Array(17);
for( var i = 0; i < 17; i ++ )
{
this.data[i] = 0;
}
this.decimal_place = 0;
}
/* 初始化結(jié)束 */
this.Add = function(num) /* 加法 */
{
if(this.positive && !num.positive)
{
num.positive = true;
var result = this.Subtract(num);
num.positive = false;
return result;
}
else if(num.positive && !this.positive)
{
this.positive = true;
var result = num.Subtract(this);
this.positive = false;
return result;
}
var result = new BigNum("", 0, this.positive);
var num1,num2;
if(this.decimal_place >= num.decimal_place)
{
num1 = this;
num2 = num;
}
else
{
num1 = num;
num2 = this;
}
result.decimal_place = num1.decimal_place;
if(num1.decimal_place - num2.decimal_place >= 17)
{
for(var i = 0; i < 17; i ++)
{
result.data[i] = num1.data[i];
}
return result;
}
var nOffDec = num1.decimal_place - num2.decimal_place;
var nTmp = 0;
for( var i = 16; i >= 0; i -- )
{
var nTmp1 = i - nOffDec;
var nTmp2 = 0;
if(nTmp1 >= 0)
{
nTmp2 = num1.data[i] + num2.data[nTmp1];
}
else
{
nTmp2 = num1.data[i];
}
nTmp2 += nTmp;
nTmp = Math.floor(nTmp2 / 10000000);
result.data[i] = nTmp2 % 10000000;
}
if(nTmp > 0)
{
result.data.unshift(nTmp);
result.decimal_place ++;
}
return result;
}
this.Subtract = function(num) /* 減法 */
{
if(this.positive && !num.positive)
{
num.positive = true;
var result = this.Add(num);
num.positive = false;
return result;
}
else if(!this.positive && num.positive)
{
this.positive = true;
var result = this.Add(num);
result.positive = false;
this.positive = false;
return result;
}
else
{
var num1 = num2 = null;
var bPositive;
if(this.decimal_place > num.decimal_place)
{
num1 = this;
num2 = num;
bPositive = this.positive;
}
else if(this.decimal_place < num.decimal_place)
{
num1 = num;
num2 = this;
bPositive = !this.positive;
}
else
{
for( var i = 0; i < 17; i ++ )
{
if(this.data[i] > num.data[i])
{
num1 = this;
num2 = num;
bPositive = this.positive;
break;
}
else if(this.data[i] < num.data[i])
{
num1 = num;
num2 = this;
bPositive = !this.positive;
break;
}
}
}
if( num1 == null)
{
return new BigNum("", 0, true);
}
else
{
if(num1.decimal_place - num2.decimal_place >= 17)
{
var result = new BigNum("", 0, bPositive);
for(var i = 0; i < 17; i ++)
{
result.data[i] = num1.data[i];
}
result.decimal_place = num1.decimal_place;
return result;
}
var result = new BigNum("", 0, bPositive);
result.decimal_place = num1.decimal_place;
var nOffDec = num1.decimal_place - num2.decimal_place;
var nTmp = 0;
for( var i = 16; i >= 0; i -- )
{
var nTmp1 = i - nOffDec;
var nTmp2 = 0;
if(nTmp1 >= 0)
{
nTmp2 = 10000000 + nTmp + num1.data[i] - num2.data[nTmp1];
}
else
{
nTmp2 = 10000000 + nTmp + num1.data[i];
}
if(nTmp2 >= 10000000)
{
result.data[i] = nTmp2 - 10000000;
nTmp = 0;
}
else
{
result.data[i] = nTmp2;
nTmp = -1;
}
}
result.recalc();
return result;
}
}
}
this.Multiply = function(num) /* 乘法 */
{
var bPositive;
var nDecimalPlace = this.decimal_place + num.decimal_place - 1;
if(this.positive == num.positive)
{
bPositive = true;
}
else
{
bPositive = false;
}
var result = new BigNum("", 0, bPositive);
var nTmpData = 0;
for( var i = 16; i >= 0; i -- )
{
for( var j = 16; j >= 0; j -- )
{
if(isNaN(result.data[j + i]))
result.data[j + i] = 0;
result.data[j + i] += this.data[j] * num.data[i];
if(result.data[j + i] >= 10000000)
{
if( j + i -1 >= 0 )
{
result.data[j + i -1] += Math.floor(result.data[j + i] / 10000000);
}
else
{
nTmpData += Math.floor(result.data[j + i] / 10000000);
}
result.data[j + i] = result.data[j + i] % 10000000;
}
}
}
if(nTmpData > 0)
{
result.data.unshift(nTmpData);
result.data.pop();
nDecimalPlace ++;
}
result.decimal_place += nDecimalPlace;
return result;
}
this.Divide = function(num) /* 除法 */
{
var bPositive;
var nDecimalPlace = this.decimal_place - num.decimal_place + 1;
if(this.positive == num.positive)
{
bPositive = true;
}
else
{
bPositive = false;
}
var result = new BigNum("", 0, bPositive);
var arrTemp = new Array(17);
for( var i = 0; i < 17; i ++ )
{
arrTemp[i] = this.data[i];
}
var bTest = true;
var nTest = 0;
for( var i = 0; i < 17; i ++ )
{
if(bTest)
{
nTest = Math.floor( ( arrTemp[0] * 10000000 + arrTemp[1] ) / ( num.data[0] * 10000000 + num.data[1] ) );
}
else
{
bTest = true;
}
if(nTest == 0)
{
result.data[i] = 0;
arrTemp[1] += arrTemp[0] * 10000000;
arrTemp.shift();
arrTemp.push(0);
continue;
}
var arrTemp1 = new Array(17);
for( var j = 0; j < 17; j ++ )
{
arrTemp1[j] = 0;
}
for( var j = 16; j >= 0; j -- )
{
arrTemp1[j] += nTest * num.data[j];
if(arrTemp1[j] >= 10000000)
{
if(j != 0)
{
arrTemp1[j - 1] += Math.floor( arrTemp1[j] / 10000000);
arrTemp1[j] = arrTemp1[j] % 10000000;
}
}
}
for( var j = 0; j < 17; j ++ )
{
if(arrTemp[j] < arrTemp1[j])
{
bTest = false;
break;
}
else if(arrTemp[j] > arrTemp1[j])
{
break;
}
}
if(bTest)
{
result.data[i] = nTest;
for( var j = 16; j >= 0; j -- )
{
if(arrTemp[j] >= arrTemp1[j])
{
arrTemp[j] -= arrTemp1[j];
}
else
{
arrTemp[j] = 10000000 + arrTemp[j] - arrTemp1[j];
arrTemp[j - 1] --;
}
}
}
else
{
nTest --;
i --;
continue;
}
arrTemp[1] += arrTemp[0] * 10000000;
arrTemp.shift();
arrTemp.push(0);
}
result.decimal_place = nDecimalPlace;
result.recalc();
return result;
}
this.SquareRoot = function() /* 平方根 */
{
var result = new BigNum("", 0, true);
nDecimalPlace = Math.ceil(this.decimal_place / 2);
var arrTemp = new Array(17);
for(var i = 0; i < 17; i ++)
{
arrTemp[i] = this.data[i];
}
var bTest = true;
for(var i = 0; i < 17; i ++)
{
if( i == 0 )
{
if(this.decimal_place % 2 == 0)
{
var nTemp = arrTemp[0] * 10000000 + arrTemp[1];
var nTemp1 = Math.floor( Math.sqrt( nTemp ) );
var nTemp2 = nTemp - nTemp1 * nTemp1;
arrTemp[0] = 0;
arrTemp[1] = nTemp2;
arrTemp.shift();
arrTemp.push(0);
}
else
{
var nTemp1 = Math.floor( Math.sqrt( arrTemp[0] ) );
var nTemp2 = arrTemp[0] - nTemp1 * nTemp1;
arrTemp[0] = nTemp2;
}
}
else
{
if(bTest)
{
if( i == 1 )
{
nTemp1 = Math.sqrt( (arrTemp[0] * 10000000 + arrTemp[1]) + 100000000000000 * Math.pow(result.data[0], 2) ) - 10000000 * result.data[0];
nTemp1 = Math.floor(nTemp1);
}
else
{
nTemp = result.data[0] * 10000000 + result.data[1];
nTemp1 = Math.floor( ( arrTemp[0] * 10000000 + arrTemp[1] ) / ( 2 * nTemp ) );
}
}
else
{
bTest = true;
}
var arrTemp1 = new Array(17);
var nTemp3 = 0
for( var j = i - 1; j >= 0; j -- )
{
arrTemp1[j] = result.data[j] * 2 + nTemp3;
if( arrTemp1[j] >= 10000000 && j > 0 )
{
nTemp3 = 1;
arrTemp1[j] = arrTemp1[j] % 10000000;
}
else
{
nTemp3 = 0;
}
}
arrTemp1[i] = nTemp1;
nTemp3 = 0;
for( var j = i; j >= 0; j -- )
{
arrTemp1[j] = arrTemp1[j] * nTemp1 + nTemp3;
if( arrTemp1[j] >= 10000000 && j > 0 )
{
nTemp3 = Math.floor( arrTemp1[j] / 10000000 );
arrTemp1[j] = arrTemp1[j] % 10000000;
}
else
{
nTemp3 = 0;
}
}
var arrTemp2 = new Array(17);
for( var j = 0; j < 17; j ++ )
{
arrTemp2[j] = arrTemp[j];
}
for( var j = i; j >= 0; j -- )
{
if( arrTemp2[j] >= arrTemp1[j] )
{
arrTemp2[j] -= arrTemp1[j];
}
else
{
if(j > 0)
{
arrTemp2[j] = arrTemp2[j] + 10000000 - arrTemp1[j];
arrTemp2[j - 1] --;
}
else
{
bTest = false;
break;
}
}
}
if(bTest)
{
arrTemp = arrTemp2;
}
else
{
nTemp1 --;
i --;
continue;
}
}
result.data[i] = nTemp1;
arrTemp[1] += arrTemp[0] * 10000000;
arrTemp.shift();
arrTemp.push(0);
}
result.decimal_place = nDecimalPlace;
result.recalc();
return result;
}
this.toString = function() /* 轉(zhuǎn)換為字符串(包括小數(shù)點(diǎn)),以便以文本形式輸出計(jì)算結(jié)果 */
{
var szData = "";
var szOutPut = "";
this.recalc();
for( var i = 0; i < 17; i ++ )
{
var szTmpData = this.data[i].toString()
var arr = new Array(8 - szTmpData.length);
szData += arr.join("0") + szTmpData;
}
if( /^0*$/.test(szData) )
{
return "0";
}
var n = this.decimal_place * 7;
for(var i = 0; i < 7; i++)
{
if(szData.substr(i, 1) != 0) break;
n --;
}
szData = szData.replace(/^0+/g,"");
szData = szData.substr(0, 101);
szData = szData.replace(/0+$/g,"");
if( n < 1 )
{
szOutPut = szData.substr(0, 1) +
( ( szData.length > 1 ) ? "." : "" ) +
szData.substr(1) + "e" + ( n - 1 ).toString();
}
else if(n == szData.length)
{
szOutPut = szData;
}
else if(n > szData.length)
{
szOutPut = szData.substr(0, 1) + "." + szData.substr(1) + "e+" + (n - 1).toString();
}
else
{
szOutPut = szData.substr(0, n) + "." + szData.substr(n);
}
return ( this.positive ? "" : "-" ) + szOutPut;
}
this.Clone = function() /* 復(fù)制 */
{
var result = new BigNum("", 0, true);
for( var i = 0; i < 17; i ++)
{
result.data[i] = this.data[i];
}
result.decimal_place = this.decimal_place;
result.positive = this.positive;
return result;
}
}
var a = new BigNum("1", 1, true)
var count = 168;
var nTwo = new BigNum("2", 1, true);
function loop(intTmpvar,intCount)
{
if(intCount == 0) return intTmpvar;
var v1 = intTmpvar.Divide( nTwo );
var v11 = v1.Clone();
var nTemp = v1.Multiply( v11 );
var a1 = a.Clone();
a1 = a.Multiply(a1);
var nTemp1 = a1.Subtract( nTemp )
v2 = nTemp1.SquareRoot();
v3 = a.Subtract( v2 );
var v31 = v3.Clone();
var nTemp2 = v3.Multiply( v31 );
var nTemp3 = nTemp2.Add(nTemp);
v4 = nTemp3.SquareRoot();
return loop( v4 , -- intCount )
}
var a1 = a.Clone();
var nTemp = a.Multiply(a1);
var nTemp1 = nTemp.Clone();
nTemp = nTemp.Add(nTemp1);
nTemp = loop(nTemp.SquareRoot(), count);
var nFour = new BigNum("4", 1, true);
nTemp = nTemp.Multiply( nFour );
nTemp1 = new BigNum("2", 1, true);
var nTemp2 = new BigNum("2", 1, true);
for(var i = 0; i < count - 1; i ++)
{
nTemp1 = nTemp1.Multiply( nTemp2 );
}
nTemp = nTemp.Multiply( nTemp1 );
nTemp = nTemp.Divide( nTwo );
nTemp = nTemp.Divide( a );
document.write( nTemp )
//-->
</script>
</body>
</html>
運(yùn)行結(jié)果:
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
PS:這里再為大家推薦幾款計(jì)算工具供大家進(jìn)一步參考借鑒:
在線一元函數(shù)(方程)求解計(jì)算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科學(xué)計(jì)算器在線使用_高級(jí)計(jì)算器在線計(jì)算:
http://tools.jb51.net/jisuanqi/jsqkexue
在線計(jì)算器_標(biāo)準(zhǔn)計(jì)算器:
http://tools.jb51.net/jisuanqi/jsq
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript操作DOM技巧總結(jié)》及《JavaScript字符與字符串操作技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
分享名稱:JavaScript實(shí)現(xiàn)計(jì)算圓周率到小數(shù)點(diǎn)后100位的方法示例
轉(zhuǎn)載源于:http://www.chinadenli.net/article24/gicije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、響應(yīng)式網(wǎng)站、虛擬主機(jī)、網(wǎng)站制作、自適應(yīng)網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)