C ++数字没有正确舍入

时间:2016-04-23 19:25:22

标签: c++

我是Stack Overflow的新手,也是一般的编程。我参加了一些编程C ++的课程,并且遇到了一个我有点麻烦的作业。这个程序应该采取华氏温度并将其转换为摄氏温度。我见过其他程序,但找不到我特定问题的副本。这是我的代码。

#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;
}

所以这对于运行的5个测试中的4个非常有用。它的轮数为22.22到22和4.44到4,但是当输入0 F时,它将-17.77舍入到-17而不是-18。我已经研究了大约一个小时,并希望得到一些帮助!谢谢。

4 个答案:

答案 0 :(得分:5)

使用std::round()而不是依赖从doubleint的隐式转换。无论是,还是根本不使用转换,都将温度显示为double

编辑:正如其他人已经指出的那样,隐式转换不会舍入,而是截断这个数字(简单地切断小数点后的所有内容)点)。

答案 1 :(得分:2)

当编译器将浮点数转换为整数时,它不会舍入,截断。即它只是在小数点后切割数字。所以你的程序就像编程一样。

答案 2 :(得分:2)

整数向下舍入,就像强制转换为整数类型一样。

最有可能的是,使用float代替int会得到最明智的结果:

#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;
}

要获得看起来很正常的输出(定点如“14.25”,用e表示法不科学),在打印浮点数之前将std::fixed传递给cout。您还可以使用cout.precision()设置输出中的数字位数。

如果由于其他原因需要int,请在表达式的右侧使用std::round()

答案 3 :(得分:0)

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

--> 
x = 3
y = 4

static_cast<int>将浮点数转换为int时,C / C ++没有进行浮点运算。如果要进行舍入,则需要调用库函数std::round()