2014-09-19 146 views
0

我無法將GPA加倍到小數點後兩位。 (需要GPA的當然要舍:3.67924)我目前使用的小區圍捕,但它目前將其作爲一個整數(368)C++舍入雙精度小數點後兩位數

這裏是我現在所擁有的

if (cin >> gpa) { 
    if (gpa >= 0 && gpa <= 5) { 
      // valid number 

      gpa = ceil(gpa * 100); 

      break; 
    } else { 
      cout << "Please enter a valid GPA (0.00 - 5.00)" << endl; 
      cout << "GPA: "; 

    } 
} 

使用上面的代碼與3.67924會輸出368(這是我想要的,但沒有整個數字和小數之間的時間段)。我怎樣才能解決這個問題?

+2

將100乘以四捨五入之後再除以100.或者,如果您只需**打印兩位小數,請保持該值不變,然後使用['setprecision'](http://打印時,請使用en.cppreference.com/w/cpp/io/manip/setprecision)。 – 2014-09-19 02:12:23

+0

標題提到四捨五入,但問題陳述提到四捨五入。舍入可以用gpa = floor((100. * gpa)+。5)/ 100來實現。 – rcgldr 2014-09-19 03:09:32

+1

'會輸出368(這是我想要的,但沒有整數和小數之間的時間間隔)。我該如何解決這個問題?'假設'gpa'是一個'double',你可以這麼做'gpa/= 100'。 – 2014-09-19 03:30:23

回答

0

試試這個。但是你的cout語句在else條件下,所以它不會給出3.67924所需的輸出。

if (cin >> gpa) 
{  
    if (gpa >= 0 && gpa <= 5) { 
     // valid number 

     gpa = ceil(gpa * 100); 
     gpa=gpa/100; 
     break; 
    } 
    else 
    {  
     cout << "Please enter a valid GPA (0.00 - 5.00)" << endl;  
     cout << "GPA: "; 
    } 
} 
1

您不能將雙打四捨五入到小數點後兩位。雙打小數點後有。他們有二進制的地方,他們與小數位不相稱。

如果您想要小數位,您必須使用小數位數,例如使用printf(「%。2f」,...)格式化輸出時。

+2

是的,但不一定有幫助 - 例如,想要*最接近*'double'到想要的2位數字的數字仍然很普遍 - 作爲在進行一些其他計算以最大限度地減少進一步的錯誤之前進行。 – 2014-09-19 03:33:47

+0

@TonyD他說他想要'3.68'。 「最近的」沒有任何關係。 – EJP 2014-09-19 03:47:57

0

如果它只是一個寫篩選然後將該數字四捨五入使用

std::cout.precision(3); 
std::cout << gpa << std::endl; 

see

浮動點並不完全代表的事情讓通過內部舍入的值,然後使用您的你正在增加不精確性的計算。