3/2 = 1 ???



  • # include<iostream>
    using namespace std;

    main()
    {

    double x;

    x=3/2;

    cout<<x<<endl; // Warum ist das Ergebnis hier 1 und nicht 1.5 ????

    system("pause");

    }



  • 3 und 2 sind Ganzzahlen, dividiert ergeben die wieder eine Ganzzahl, also in dem Fall 1 und dann erst wird das Ergebnis nach double gecasted (1.) und an x zugewiesen.

    Richtig:

    x = 3. / 2
    oder schöner:

    x = 3.0 / 2.0

    MfG SideWinder



  • Weil du eine Ganzzahlendivision durchführst.

    3/2 = 1 Rest 1

    Versuch mal:

    x=3.0/2;
    


  • Danke!!!

    es geht auch mit:

    x=(double) 3/2;



  • LaGrave schrieb:

    Danke!!!

    es geht auch mit:

    x=(double) 3/2;

    Klar, weil du mit dem Cast aus 3 3.0 machst.

    (double)(3/2) würde wiederum nicht gehen, ne...



  • klingt auch logisch, aber

    warum kann er z.B 3/0.4 aber nicht 3/4 ?
    Beides sollte er demnach doch aufrunden ?



  • LaGrave schrieb:

    klingt auch logisch, aber

    warum kann er z.B 3/0.4 aber nicht 3/4 ?
    Beides sollte er demnach doch aufrunden ?

    Nee, da wird nicht kaufmännisch gerundet! Das ist ne Division, wie du sie von der Grundschule kennst.

    7/4 = 1 Rest 3

    Mit dem Operator '/' kriegst du die 1, mit dem Operator '%' (Modulo) kriegst du die 3, also den Rest.

    Also:

    double x;
    x=7/4;    //x wird 1 zugewiesen (bzw. durch den impliziten Cast nach double 1.0)
    x=7%4;    //x wird 3 zugewiesen
    x=7.0/4;  //x wird 1.75 zugewiesen (denn 7.0 ist ein double-Wert, folglich ist das Ergebnis des Ausdrucks auch vom Typ double)
    


  • Oder so

    int a=2;
    int b=3;
    double x=((double)a)/((double)b)
    cout << x << endl;
    

    ... müsste klappen



  • ProgrammierGeselle schrieb:

    Oder so

    int a=2;
    int b=3;
    double x=((double)a)/((double)b)
    cout << x << endl;
    

    ... müsste klappen

    Klar klappt das. Aber das extra speichern in Variablen ist hier eigentlich unnötig, und einen der Casts könntest du wegkürzen (denn wenn ein Element des Ausdrucks double ist, ist das Ergebnis automatisch auch double; also double/int=double). Und die Klammern um den jeweiligen Cast kann man auch weglassen (man kann sie aber natürlich auch zur besseren Lesbarkeit stehen lassen).



  • Klar muss man keine Variablen nehmen,
    wollte nur zeigen wie sich das Problem mit Variablen lösen lässt,
    Man kann NATÜRLICH auch a durch 2 und b durch 3 ersetzen,
    aber ich glaube nicht, dass jeder 2 durch 3 teilt.

    Mfg, der Programmiergeselle



  • ProgrammierGeselle schrieb:

    Klar muss man keine Variablen nehmen,
    wollte nur zeigen wie sich das Problem mit Variablen lösen lässt,

    Lösen? Also es ändert eigentlich rein gar nichts, wenn du die Werte vorhr in Variablen packt. Die Lösung liegt eher darin, den Typ anzupassen (ob jetzt direkt oder gecastet).

    ProgrammierGeselle schrieb:

    Man kann NATÜRLICH auch a durch 2 und b durch 3 ersetzen,
    aber ich glaube nicht, dass jeder 2 durch 3 teilt.

    Sorry, das verstehe ich nicht... 🙂


  • Mod

    _matze schrieb:

    Sorry, das verstehe ich nicht... 🙂

    Programmiergeselle wollte zeigen, wie man es macht, wenn man nicht mit Integerliteralen arbeitet, sondern mit Variablen.



  • Als Lösung und Kernaussage würde ich die Antwort von _matze bevorzugen:

    ...(denn wenn ein Element des Ausdrucks double ist, ist das Ergebnis automatisch auch double; also double/int=double)...

    also:

    double/int = double
    int/double = double
    int/int = wird int und die Nachkommastellen fallen weg



  • er rechnet ja bei Variablen "richtig" und nicht mit Rest, wie erhält man dann nicht den Rest, das geht mit Modulo ja immer noch, aber den Wert, also sein Ergebnis ?



  • Tim06TR schrieb:

    er rechnet ja bei Variablen "richtig" und nicht mit Rest, wie erhält man dann nicht den Rest, das geht mit Modulo ja immer noch, aber den Wert, also sein Ergebnis ?

    😕



  • Tim06TR schrieb:

    er rechnet ja bei Variablen "richtig" und nicht mit Rest, wie erhält man dann nicht den Rest, das geht mit Modulo ja immer noch, aber den Wert, also sein Ergebnis ?

    nach dem Ausgangsproblem rechnet er nicht mit zwei int Werten richtig:

    double x;
    int a=5;
    int b=3;
    x=  a/b;
    cout<<x<<endl; // Ausgabe : 1
    

    den Rest erhälst du mit:

    double x;
    int a=5;
    int b=3;
    x=  a%b;
    cout<<x<<endl; // Ausgabe: Rest : 2
    

Log in to reply