Ethan Adams
Ethan Adams

Reputation: 63

C++ numbers aren't rounding correctly

I am new to Stack Overflow, and programming in general. I am in a few classes for programming C++ and have come across an assignment I am having a bit of trouble with. This program is supposed to take fahrenheit and convert it to celsius. I have seen other programs, but could not find a duplicate to my particular problem. This is my code.

#include <iostream>
using namespace std;

int main()
{
    int fahrenheit;
    cout << "Please enter Fahrenheit degrees: ";
    cin >> fahrenheit;
    int celsius = 5.0 / 9 * (fahrenheit - 32.0);
    cout << "Celsius: " << celsius << endl;

    return 0;
}

So this is working great on 4 of the 5 tests that are run. It rounds 22.22 to 22 and 4.44 to 4 like it should, but when 0 F is put in, it rounds -17.77 to -17 instead of -18. I have been researching for about an hour and would love some help! Thank you.

Upvotes: 5

Views: 2858

Answers (4)

Vucko
Vucko

Reputation: 7479

Use std::round() instead of relying on the implicit conversion from double to int. Either that, or do not use conversion at all, show the temperature as a double.

EDIT: As others already pointed out, implicit conversion will not round but truncate the number instead (simply cut off everything after the decimal point).

Upvotes: 6

user3995702
user3995702

Reputation:

Integers round down implicitly, as do casts to integer types.

Most likely, using a float in place of an int would give the most sane results:

#include <iostream>
using namespace std;

int main()
{
    int fahrenheit;
    cout << "Please enter Fahrenheit degrees: ";
    cin >> fahrenheit;
    float celsius = 5.0 / 9 * (fahrenheit - 32.0);
    cout << "Celsius: " << celsius << endl;

    return 0;
}

To get normal-looking output (fixed-point like "14.25", not scientific with e notation), pass std::fixed to cout before printing the floating point. You can also use cout.precision() to set the number of digits you would like in the output.


If for some other reason you need an int, use std::round() around the right hand of the expression.

Upvotes: 2

BitTickler
BitTickler

Reputation: 11875

int x = 3.99;
int y = std::round(3.99);
std::cout 
   << "x = " << x << std::endl
   << "y = " << y << std::endl
   ;

--> 
x = 3
y = 4

C/C++ is not doing floating point round when static_cast<int>-ing a float to an int. If you want to round, you need to call library function std::round()

Upvotes: 0

Some programmer dude
Some programmer dude

Reputation: 409166

When the compiler converts a floating point number to an integer, it doesn't round, it truncates. I.e. it simply cuts of the digits after the decimal point. So your program behaves as it is programmed to do.

Upvotes: 2

Related Questions