#include <iostream>
#include <iomanip>
#include <cmath>
int main()
{
int num;
double inmon,value;
double ans;
const double wtf= 100.0f;
while(std::cin>> num){
while(num--){
std::cin>> inmon>> value;
ans= (value/inmon-1)*10000;
ans= round(ans);
ans= ans/wtf;
std::cout<< std::fixed<< std::setprecision(2)<<
ans<< "% "<< ((ans>-7&&ans<10)?"keep\n":"dispose\n");
}
}
}
錯在50%的第一題8.99%
兩個測資分別是20000 跟 21797
在自己的電腦進行是8.99但到了judge就變成8.98%了
由於本人跑您的程式也是出現 8.98% 的結果。推測是浮點數誤差跟 round() 函式的關係。
因為電腦儲存小數時,是用固定位元長的區塊且以二進位的方式儲存小數點。跟十進位有 4 / 3 = 1.333…… 一樣,二進位也有自己的循環小數,而資料又是固定長的,因此會有截斷的問題。也就導致了誤差。
而 round() 函式作用是取到最接近的整數部分(如果是 5.5 ,則會取成 6 ),而本人這邊跑 (21797 / 20000 - 1) * 10000 的結果為 898.4999999……,因此 round() 函式將其取整為 898
可以考慮將浮點數加上一個很小的誤差數字(例如 0.0000001 等),再去做 round() 跑出來才會是題目想要的結果。
關於更詳盡的,關於浮點數的資料可以自行 Google 或是從以下網址進去查閱:
http://edisonx.pixnet.net/blog/post/46103946-%5B%E6%B5%AE%E9%BB%9E%E6%95%B8%5D-ieee754-,-c-c++-%E6%B5%AE%E9%BB%9E%E6%95%B8%E8%AA%A4%E5%B7%AE
http://davidhsu666.com/archives/ieee-754/
以上,希望有幫助到您。