3 回答

TA貢獻1883條經驗 獲得超3個贊
你說得對。4實際上并不是Pi的值。
問題是denominator變量是int所以結果1/denomenator是。這使得您在一次迭代后退出循環,因為int/int0pi == prevPi
只需將denominator類型更改為雙精度(或浮點數),您就會得到正確的答案。
另外,你不需要寫while(keepGoing == true). 該變量keepGoing已經是一個布爾值,你可以簡單地寫while(keepGoing)
編輯:
我喜歡使用這段代碼,所以這里有一個稍微短一點的版本,由于使用了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貢獻1804條經驗 獲得超2個贊
問題是整數除法會產生整數,而不是浮點數或雙精度數。
1 / 3
是 0。
為了避免這種情況,您可以改用浮點數作為分母,而不是整數。
float denominator = 1.0f;

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