C++将double舍入到2位小数

eaf3rand  于 11个月前  发布在  其他
关注(0)|答案(9)|浏览(138)

我有麻烦四舍五入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(这是我想要的,但没有整数和小数之间的周期).我如何解决这个问题?

bjp0bcyl

bjp0bcyl1#

要将双精度型舍入到小数点后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;
}


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

jslywgbw

jslywgbw2#

如果这只是一个问题,写屏幕,然后四舍五入的数字使用

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

字符串
see
浮点数不能精确地表示,所以通过内部舍入值,然后在计算中使用它,会增加不精确性。

dpiehjr4

dpiehjr43#

当你试图在一个变量中存储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";

字符串

uoifb46i

uoifb46i4#

你不能将双精度数四舍五入到小数点后两位。双精度数没有小数点。它们有二进制位,并且它们不能用小数点表示。
如果你想要小数位数,你必须使用十进制基数,例如当用printf(“%.2f”,...)格式化输出时。

yqlxgs2m

yqlxgs2m5#

试试这个。但是你的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: ";
    }
}

字符串

8tntrjer

8tntrjer6#

例如:您希望将56.89999999999输出为一个带有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
}

字符串
不确定这是否能帮助?

5ssjco0h

5ssjco0h7#

这可以通过fixed和setprecision()的组合来完成。

cout << fixed << setprecision(2);
 cout << gpa;

字符串

vfh0ocws

vfh0ocws8#

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。

osh3o9ms

osh3o9ms9#

#include <iostream>
using namespace std;

double round(double var)
{
    // 37.66666 * 100 =3766.66
    // 3766.66 + .5 =3767.16    for rounding off value
    // then type cast to int so value is 3767
    // then divided by 100 so the value converted into 37.67
    double value = (int)(var * 100 + .5);
    return (double)value / 100;
}

int main()
{
    double var = 37.66666;
    double var2 = 48.7432;
    double var3 = 59.8453;
    cout << round(var) << endl;
    cout << round(var2) << endl;
    cout << round(var3) << endl;
    return 0;
}

// Output:
// 37.67
// 48.74
// 59.85

字符串

相关问题