C++ 将双精度舍入到小数点后两位

Bry*_*ahn 14 c++ rounding cin ceil

我无法将 GPA 双精度舍入到小数点后两位。(前 GPA 需要四舍五入:3.67924)我目前正在使用 ceil 进行四舍五入,但它目前将其输出为整数 (368)

这是我现在拥有的

if (cin >> gpa) {
    if (gpa >= 0 && gpa <= 5) {
           // valid number

           gpa = ceil(gpa * 100);

           break;
    } else {
           cout << "Please enter a valid GPA (0.00 - 5.00)" << endl;
           cout << "GPA: ";

    }
}
Run Code Online (Sandbox Code Playgroud)

将上面的代码与 3.67924 一起使用将输出 368(这是我想要的,但只是没有整数和小数之间的句点)。我怎样才能解决这个问题?

kav*_*ish 22

要将双精度舍入到小数点后两位,您可以使用:

#include <iostream>
#include <cmath>

int main() {
    double value = 0.123;
    value = std::ceil(value * 100.0) / 100.0;
    std::cout << value << std::endl; // prints 0.13
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要四舍五入到 n 个小数位,您可以使用:

double round_up(double value, int decimal_places) {
    const double multiplier = std::pow(10.0, decimal_places);
    return std::ceil(value * multiplier) / multiplier;
}
Run Code Online (Sandbox Code Playgroud)

这种方法不会特别快,如果性能成为问题,您可能需要其他解决方案。

  • 在我的具体情况下,我更喜欢使用 `std::round` 而不是 `std::ceil`,但您的解决方案绝对完美。谢谢! (4认同)

And*_*rsK 9

如果这只是写屏幕的问题,那么将数字四舍五入使用

std::cout.precision(3);
std::cout << gpa << std::endl;
Run Code Online (Sandbox Code Playgroud)

浮点数不能完全表示,因此通过内部舍入值然后在计算中使用它会增加不精确性。


小智 6

当您尝试在变量中存储最多 n 个十进制值时。您必须将该值乘以 10^n,然后除以 10^n。然后在程序中使用类型运算符进行操作。这是示例:-

 float a,b,c,d,sum;

 cin>>a>>b>>c>>d; // reading decimal values

sum=(a*b*c*d);

sum=round(sum*100)/100; // here it is for 2 decimal points

if((float)sum < (float) 9.58)
  cout<<"YES\n";
else
  cout<<"NO\n";  
Run Code Online (Sandbox Code Playgroud)


use*_*421 5

您不能将双精度数四舍五入到小数点后两位。双精度数没有小数位。它们有二进制位,并且不能与小数位相通。

如果需要小数位,则必须使用小数基数,例如,在使用 printf("%.2f", ...) 格式化输出时。

  • 确实如此,但不一定有帮助 - 例如,希望*最近的*“double”到预期的 2 位十进制数字仍然很常见 - 作为进行其他计算之前的一个步骤,以最大限度地减少进一步的错误。 (11认同)

MD.*_*sar 2

尝试这个。但是您的cout语句处于 else 条件下,因此它不会给出 3.67924 所需的输出。

if (cin >> gpa)
{     
    if (gpa >= 0 && gpa <= 5) {
        // valid number

        gpa = ceil(gpa * 100);
        gpa=gpa/100;
        break;
    } 
    else
    {    
       cout << "Please enter a valid GPA (0.00 - 5.00)" << endl;    
       cout << "GPA: ";
    }
}
Run Code Online (Sandbox Code Playgroud)