2015-12-04 3 views
-2

Мне нужно округлить некоторые номера ввода, используя C++. Ниже мой код. `Программа округления

#include <iostream> 
#include <math.h> 
using namespace std; 
int main() { 
    int a; 
    int b; 
    int c; 
    cin >> a; 
    for (int i =0; i<a; i++) { 
    cin >> b; 
    cin >> c; 
    int result = b/c; 
    if (result > 0) { 
     cout << floor(result + 0.5) << " "; 
    } else { 
     cout << ceil(result - 0.5) << " "; 
    } 
    } 
} 

Однако, я постоянно получаю слишком низкие ответы.

Пример ввода:

15 
6525 1410 
14431 510 
9163 480 
5461 1938 
6969 1220 
-7065150 -4171886 
-9268414 -1461265 
17913 584 
-32381 -634679 
19887 1666 
5133363 4488942 
5440267 601 
4700414 923 
4699610 15 
4322342 201 

Выход: 4 28 19 2 5 1 6 30 -0 11 1 9052 5092 313307 21504

Ожидаемое: 5 28 19 3 6 2 6 31 0 12 1 9052 5093 313307 21504

Что я сделал не так? (И почему я получил отрицательный ноль на одном из них?)

+0

Пожалуйста, не изменяйте вопрос, чтобы его существенно изменить. Это аннулирует ответы, которые вы получили до сих пор. Вместо этого задайте новый вопрос в этих случаях. Я не понимаю, что вы подразумеваете под «Я не мог добавить проблему». –

+0

сайт помешал мне задать новый вопрос. –

+0

Я не знаю, почему вы не можете задавать другие вопросы, но в любом случае переписывание одного, превращающего его в новое, недопустимо. И это даже не эффективно, потому что многие люди даже не читают его, видя, что уже есть 2 ответа. Поэтому, пожалуйста, нажмите на править и отбросьте его обратно в ревизию 2. Что касается вопроса о новом вопросе, возможно, вы были отстранены по какой-то причине (в этом случае вы должны были быть четко проинформированы). Дождитесь окончания срока действия приостановки или свяжитесь с персоналом сайта, если вы считаете, что это техническая проблема. –

ответ

2

Вы выполняете деление по int, а не поплавок. Вы можете сделать это исправить:

double result = static_cast<double>(b)/c; 

и лучше использовать слово также значение 0, чтобы избежать отрицательного нуля, т.е.

if (result >= 0.0) { 
+0

если вы не возражаете, я спрашиваю, что значит "static_cast " делать? –

+0

и спасибо, вы решили. –

+0

Статические_сказки от int до double, так что деление выполняется с плавающей запятой и не прерывает остаток. – axalis

0

Еще одна проблема, в дополнение к выполнению деления как целое как другой ответ указал, что вы должны использовать std::round(3). Вручную добавление/вычитание .5 восприимчиво к ошибкам округления, и нет причин изобретать колесо, когда std::round выполнит эту работу за вас.