Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Diskuze: Zaokrouhlování

C a C++ C a C++ Zaokrouhlování American English version English version

Aktivity (1)
Avatar
Jan Michálek:9. října 14:38

Zdravím,

potřebuji poradit. Mám úkol do školy, kde při výběru od uživatele a zadáním vstupní hodnoty (nebo hodnot) se vypočítá obsah a obvod čtverce, obdelníku, kruhu. Všechno jsem si napsal, ale potřebuji mít výsledek se 4 desetinnými místy ale za nic na to nemůžu přijít jak se to dělá. Mohl by mi někdo prosím poradit?

#include <iostream>
#include <cmath>
#define _USE_MATH_DEFINES

using namespace std;

int main()
{
    cout << "Zadejte rovinny obrazec, jehoz obsah a obvod chcete spocitat: a - ctverec, b - obdelnik, c - kruh" << endl;
    char vstup;
    cin >> vstup;
    if (vstup == 'a'){
        cout << "Zadejte stranu ctverce:" << endl;
        double StranaCtverce;
        cin >> StranaCtverce;
        if (StranaCtverce > 0){
            cout << "Obsah ctverce je: " << StranaCtverce*StranaCtverce << endl;
            cout << "Obvod ctverce je: " << 4*StranaCtverce << endl;
        }
        else {
            cout << "Nespravny vstup." << endl;
        }
    }
    if (vstup == 'b'){
        cout << "Zadejte strany obdelniku:" << endl;
        double StranaObdelniku1, StranaObdelniku2;
        cin >> StranaObdelniku1 >> StranaObdelniku2;
        cout << "Obsah obdelniku je: " << StranaObdelniku1*StranaObdelniku2 << endl;
        cout << "Obvod obdelniku je: " << 2 * (StranaObdelniku1+StranaObdelniku2) << endl;
    }
    if (vstup == 'c'){
        cout << "Zadejte polomer kruznice:" << endl;
        double PolomerKruznice;
        cin >> PolomerKruznice;
        cout << "Obsah kruznice je: " << M_PI * (PolomerKruznice*PolomerKruznice) << endl;
        cout << "Obvod kruznice je: " << 2*M_PI*PolomerKruznice << endl;
    }
    if (vstup != 'a' && vstup != 'b' && vstup != 'c') {
        cout << "Nespravny vstup." << endl;
    }
    return 0;
}

Zkusil jsem: Google.

Odpovědět 9. října 14:38
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jan Michálek
Martin Dráb:9. října 14:51

Co toto?

x = round(x*10000) / 10000;

Trik je v tom, že tebou požadovaná desetinná místa se stanou součástí celé části čísla, takže funkce round vlastně ovlivní pouze čtvrté des. místo v závislosti na pátém (které je po vynásobení 10000 vlastně první). Po zaokrouhlení vydělíš 10000, abys desetinná místa vrátil tam, kam patří.

Vzhledem k interní reprezentaci double a spol (IEEE 754) se pořád můžeš dostat do problémů se zaokrouhlováním, ale to proto, že tebou požadované číslo nelze interně reprezentovat přesně. Bohužel, taková běžná čísla jako 0.2 prostě ve dvojkové soustavě nezapíšeš, ledaže bys měl nekonečně velký papír.

Nahoru Odpovědět 9. října 14:51
2 + 2 = 5 for extremely large values of 2
Avatar
Jan Michálek:9. října 15:34

Tak nakonec jsem použil funkci setprecision ()

vložil jsem funkci hned pod vstup uživatele cout << setprecision (4) <<fixed;

A šlape to jak má. ;-)

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět  +1 9. října 15:34
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.