C++数字不能正确四舍五入

4

我是 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。我已经研究了大约一个小时,希望能得到帮助!谢谢。


C++总是向下舍入吗?如果是的话,我该如何使其四舍五入到-18?我运行的测试中只有这一个失败了。它期望程序显示-18,但我的程序显示-17。 - Ethan Adams
2
因为将浮点数或双精度数转换时,默认会将其截断。要四舍五入,请使用可执行此操作的库函数(请谷歌搜索)。 - Majora320
@Majora320 实际上有许多种舍入方式: "朝零方向" (也称为 "截断"), "朝负无穷大的方向" (也称为 "向下舍入"), "朝正无穷大的方向" (也称为 "向上舍入"), "朝无穷大的方向" (基本上是 "远离零"),以及 "四舍五入到最近的整数" (默认含义?有时不同方法中会出现差异)。而 "四舍五入到最近的整数" 的方法在舍入 n+0.5 分数时会有所不同。 - Joker_vD
这里没有四舍五入,只有整数截断。 - user207421
4个回答

5

请使用std::round()代替依赖于从doubleint的隐式转换。或者完全不使用转换,将温度显示为double

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


2

当编译器将浮点数转换为整数时,它不会四舍五入,而是截断。也就是说,它只是简单地截去小数点后面的数字。因此,您的程序表现出了它所编程的行为。


2

整数会隐式向下取整,类型转换为整数类型也是如此。

最有可能的是,在需要整数的地方使用 float 会得到最合理的结果:

#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”的固定点,而不是科学计数法),在打印浮点数之前,将std::fixed传递给cout。您还可以使用cout.precision()来设置输出中所需的数字位数。
如果出于其他原因需要整数,请在表达式的右侧使用std::round()

@EthanAdams 这听起来像是一个单独的问题,也许有一个更有趣的答案。但在这种情况下,舍入并没有“错误”——你看到的是整数应该发生的事情。 - user3995702
1
@EthanAdams 这可能是你需要获得预期结果的另一件事情:http://www.cplusplus.com/reference/ios/fixed/。但我想知道,除非它们很小/很大,否则为什么要首先获取 e 格式浮点数。 - user3995702
只需在int fahrenheit之前添加cout.precision(0);即可实现此功能-当我将F设置为72时,C的答案为2e + 01,-40的答案为-4e + 01,32的答案为0,40的答案为4,而0的答案为-2e + 01。当我将cout.precision(0)更改为(1)时,得到完全相同的答案。 - Ethan Adams
如果用于表示答案所需的数字位数小于精度,则必须使用科学计数法。例如:如何使用1个数字显示0.01?它必须是1e-2。请使用std :: fixed。 - user3995702
@EJP 这与向下取整在术语上几乎相同。我想你可以争辩说 floor 不是向下取整,但对于那些在基本概念上有问题的人来说,这是一个无益的争论。 - user3995702
显示剩余4条评论

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

C/C++在将浮点数转换为整数时,不会进行四舍五入。如果您想要进行四舍五入,需要调用库函数std::round()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接