3 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
你說得對。4實(shí)際上并不是Pi的值。
問題是denominator變量是int所以結(jié)果1/denomenator是。這使得您在一次迭代后退出循環(huán),因?yàn)閕nt/int0pi == prevPi
只需將denominator類型更改為雙精度(或浮點(diǎn)數(shù)),您就會得到正確的答案。
另外,你不需要寫while(keepGoing == true). 該變量keepGoing已經(jīng)是一個(gè)布爾值,你可以簡單地寫while(keepGoing)
編輯:
我喜歡使用這段代碼,所以這里有一個(gè)稍微短一點(diǎn)的版本,由于使用了double. 它似乎也收斂得更快:
double pi = 0, denominator = 1, prevPi = 1;
while (pi != prevPi) {
prevPi = pi;
pi += (1 / denominator) - (1 / (denominator + 2));
denominator += 4;
}
return pi * 4;

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
問題是整數(shù)除法會產(chǎn)生整數(shù),而不是浮點(diǎn)數(shù)或雙精度數(shù)。
1 / 3
是 0。
為了避免這種情況,您可以改用浮點(diǎn)數(shù)作為分母,而不是整數(shù)。
float denominator = 1.0f;

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
讓你的所有操作數(shù)都是浮點(diǎn)類型。否則你的結(jié)果是一個(gè)整數(shù)。
請參閱Java 語言規(guī)范:
如果提升的類型是 float 或 double,則執(zhí)行浮點(diǎn)運(yùn)算。
另外,在大多數(shù)平臺上,您可以使用double而不會造成任何性能損失,但這是另一個(gè)主題。;-)
添加回答
舉報(bào)