C++ rond een dubbel af tot op 2 decimalen

Ik heb problemen met het afronden van een dubbele GPA op 2 decimalen. (bijv. van een GPA moest worden afgerond: 3.67924) Ik gebruik momenteel ceil om naar boven af ​​te ronden, maar het geeft het momenteel als een geheel getal weer (368)

dit is wat ik nu heb

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: ";
    }
}

het gebruik van de bovenstaande code met 3.67924 zou 368 opleveren (wat ik wil, maar alleen zonder de punt tussen het hele getal en de decimalen). Hoe kan ik dit oplossen?


Antwoord 1, autoriteit 100%

Om een ​​dubbel af te ronden tot op 2 decimalen, kunt u het volgende gebruiken:

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

Om op n decimalen af ​​te ronden, kunt u het volgende gebruiken:

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

Deze methode zal niet bijzonder snel zijn, als prestaties een probleem worden, heb je misschien een andere oplossing nodig.


Antwoord 2, autoriteit 43%

Als het gewoon een kwestie van naar het scherm schrijven is, gebruik dan om het getal af te ronden

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

zie

zwevende punten worden niet exact weergegeven, dus door de waarde intern af te ronden en die vervolgens in uw berekeningen te gebruiken, vergroot u de onnauwkeurigheid.


Antwoord 3, autoriteit 10%

Je kunt verdubbelingen niet afronden op twee decimalen. Dubbelen hebben geendecimalen. Ze hebben binaire plaatsen en ze zijn niet te vergelijken met decimalen.

Als u decimalen wilt, moet u een decimale radix gebruiken, b.v. bij het formatteren voor uitvoer met printf(“%.2f”, …).


Antwoord 4, autoriteit 10%

Probeer dit eens. Maar je cout-statement in else-conditie, dus het geeft niet de gewenste output voor 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: ";
    }
}

Antwoord 5

Voorbeeld: u wilt dat 56,89999999999 wordt uitgevoerd als een tekenreeks met 2 decimalen, wat 56,89 is.

Converteer ze eerst
waarde = 56,89 * 1000 = 5689
factor = 100
– 1 decimaal = 10
– 2 decimalen = 100
– 3 decimalen = 1000
enz

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
}

Weet je niet zeker of dit kan helpen?


Antwoord 6

Als u waarden tot n decimale waarden in een variabele probeert op te slaan.
Je moet die waarde vermenigvuldigen met 10^n en delen door 10^n.
Gebruik daarna de type-operator om in het programma te manipuleren.
Hier is het voorbeeld: –

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";  

Antwoord 7

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

Behandelt goed voor alle positieve floats. Een kleine wijziging zorgt ervoor dat het ook voor -ves werkt.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes