亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問下為什么在i=13和i=20時,兩種方法算出的結果不同?求解釋?

請問下為什么在i=13和i=20時,兩種方法算出的結果不同?求解釋?

C PHP
海綿寶寶撒 2022-04-22 11:07:08
我寫了一個關于求1/2+2/3+...+i/(i+1)的程序,有兩個方法,一個用遞歸,一個不用,結果精確到0.0001;為什么在i=13和i=20時,兩種方法算出的結果不同?兩個結果相差0.0001.public class Test4_25 {public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("i m(i)"); for(int i=1;i<=20;i++){ double number1=isRecursion(i); double number2=isNotRecursion(i); if(i<10) System.out.println(i+" "+number1+" "+number2); else System.out.println(i+" "+number1+" "+number2); } } static double isRecursion(int number){ if(number==1) return 0.5; else{ double replace=0; replace=number*1.0/(number+1)+isRecursion(number-1); return Math.round(replace*10000)/10000.0; } } static double isNotRecursion(int number){ double sum=0,index=0; for(int i=1;i<=number;i++){ index=i*1.0/(i+1); sum=sum+index; } return Math.round(sum*10000)/10000.0; }}
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

因為遞歸方法計算函數中的這句:
return Math.round(replace*10000)/10000.0;
每次遞歸的返回值都被你精確到萬分之一而四舍五入了,這樣會有累積誤差
而循環方法計算的就沒有這個問題,直到最后才四舍五入一次。
正確做法是return Math.round(replace*10000)/10000.0;改成return replace;
遞歸完全返回后,對結果進行一次四舍五入。

查看完整回答
反對 回復 2022-04-24
?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

簡單說,是因為計算過程的精度不夠
return Math.round(replace*10000)/10000.0; //這可是每次都做round的,而
return Math.round(sum*10000)/10000.0;//這只是在結束的時候做一次round

查看完整回答
反對 回復 2022-04-24
  • 2 回答
  • 0 關注
  • 249 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號