Mathefunktion Dividieren / teilen usw.



  • Hallo, dachte immer ich kann Mathe (bis heute):

    Integer i2=27,iProz[100]; AnsiString z3; iProz[99]=27;
    
    z3="0%"; if(i2>0 && iProz[99]>0) { z3=IntToStr(100/iProz[99]*i2)+"%"; }       // Prozentanteil errechnen
    

    bzw. mit festen Werten:

    z3="0%"; if(i2>0 && iProz[99]>0) { z3=IntToStr(100/27*27)+"%"; }              // Prozentanteil errechnen
    

    ergibt in beiden Fällen im String z3= "81%" !???? 😕

    Da bei 100/27 * 27 wieder 100 rauskommen muss (also absolut ein
    Intergerwert ist), verstehe ich nicht, wieso ich auf 81 komme???
    Mit div(100,27) * 27 geht auch nicht .

    Wo steckt der Denkfehler?

    Gruss, Stefan Scholz



  • Du rechnest mit int-Werten, da fallen Nachkommastellen zwischendurch unter den Tisch: 100/27 = 3, 3*27 = 81. Wenn du Interesse an den Nachkommastellen hast, benötigst du Gleitkomm-Arithmetik:

    z3=IntToString(int(100.0/iProz[99]*i2))+"%";
    


  • Hallo, CStoll

    vielen Dank! Das steht leider in der Hilfe bei
    / nicht mit drin. Ich gebe allerdings zu, daß es
    mir noch nicht ganz einleuchtet, da ich mit int()
    doch eigentlich wieder eine Berechnung auf Integer
    mache oder ist das nur für die IntToStr()-Funktion?

    Wenn ich das richtig erkenne, ist das entscheidende
    nur das 100.0 statt 0?

    Wie wäre das denn, wenn jetzt die 100 auch ein Platzhalter
    wäre? Welchen Typ müsste ich dann nehmen? Double?

    Gruss, Stefan



  • Hallo

    wenn zwei Integer-Werte dividiert werden, kommt auch wieder ein Integer-Wert heraus, der Nachkomma-Teil wird angeschnitten (also abgerundet).

    durch das 100.0 wird der Compiler gezwungen die Division als float durchzuführen, durch den dann enthaltenen Nachkomma-Teil wird dann natürlich auch die folgende Rechnung beeinflußt.

    Das int() wird nur benütigt, um dann wieder für IntToStr() einen Integer-Wert zu bekommen.

    Wenn du statt 100.0 eine Variable willst, must du tatsächlich float oder double nehmen.

    bis bald
    akari



  • Oder du müsstest die Variable explizit nach double casten (ich weiß, so ein hin- und her-gecasten sieht nicht besonders feierlich aus :D).



  • ich danke Euch beiden.
    🙂

    Gruss, Stefan Scholz


Log in to reply