19

我无法将 GPA 双精度数舍入到小数点后 2 位。(需要四舍五入的 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: ";

    }
}

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

4

7 回答 7

30

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

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

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

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

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

于 2019-08-12T10:27:09.923 回答
14

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

std::cout.precision(3);
std::cout << gpa << std::endl;

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

于 2017-03-15T05:17:05.773 回答
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: ";
    }
}
于 2014-09-19T02:30:35.843 回答
1

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

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

于 2014-09-19T03:20:01.063 回答
0

当您尝试在变量中存储最多 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";  
于 2021-04-03T10:56:53.520 回答
0

示例:您希望将 56.899999999999 输出为带 2 个小数点的字符串,即 56.89。

首先,将它们转换为
值 = 56.89 * 1000 = 5689
因子 = 100
- 1 个小数点 = 10
- 2 个小数点 = 100
- 3 个小数点 = 1000

int integerValue;
int decimal;
std::string result;
function ( int value , int factor)
{
    integerValue= (value / factor) * factor; //(5689 / 100) * 100 = 5600
    decimal = value - integerValue;  // 5689 - 5600;
    result = std::to_string((int)(value/factor) + "." + std::to_string(decimal); 
    // result = "56" + "." + "89" 
    // lastly, print result
}

不确定这是否有帮助?

于 2019-10-25T02:37:13.373 回答
-1
std::string precision_2(float number)
{
    int decimal_part = (number * 100) - ((int)number * 100);
    if (decimal_part > 10) {
        return std::to_string((int)number) + "." + std::to_string(decimal_part);
    } else {
        return std::to_string((int)number) + ".0" + std::to_string(decimal_part);
    }
}

处理所有正浮点数。稍作修改将使其也适用于 -ves。

于 2020-06-23T10:23:23.040 回答