#12972: 關於誤差的解決


k963852741 (啓揚)

學校 : 臺中市立東山高級中學
編號 : 60198
來源 : [140.128.173.197]
最後登入時間 :
2018-11-24 12:16:59
a647. 投資專家 | From: [111.67.57.124] | 發表日期 : 2017-11-12 22:02

本題計算獲利率的公式為(p-m)/p*100%

而四捨五入的函式我使用的是

cout<<fixed<<setprecision(2)<<獲利率<<"% dispose"<<endl;

意即輸出獲利率四捨五入取到小數後兩位的結果

EX:  5.322 ==> 5.32   3.22466 ==> 3.22  8.785 ==>8.79

但是有個缺點,在數學定義上 0.9999..... = 1     5.649999.... =5.65

在0.999...循環的情況下將直接視為1

而這個函數並不會管後方是否為9循環,所以我清除誤差的做法是這樣的

在後方若干小數位上加1(如果是負數則減1)

if(獲利率>0){

獲利率+=0.00001;

}else if(獲利率<0){

獲利率-=0.00001;

}                                                                //依題目表示1≤m,p≤100000,故小數最多五位

使其後方為999...循環時強制進位,不是999...循環時便不受影響,便可消除此誤差

 
ZeroJudge Forum