C++数字未正确舍入

C++ numbers aren't rounding correctly

本文关键字:舍入 数字 C++      更新时间:2023-10-16

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

使用 std::round() 而不是依赖于从 doubleint 的隐式转换。要么,要么根本不使用转换,将温度显示为double .

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

整数隐

式向下舍入,转换为整数类型也是如此。

最有可能的是,使用 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()

当编译器将浮点数转换为整数时,它不会舍入,而是修剪。 即它只是削减小数点后的数字。因此,您的程序的行为与编程一样。

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++ 在将浮点数static_cast<int> -ing 为 int 时不进行浮点圆。如果要舍入,需要调用库函数std::round()