Rene Grassegger: Zinsenberechnung Berechnungs-Fehler mit 4.5 und 4,5 (bcmaths)

Hallo Leute,

ich suche schon 2 Stunden einen Fehler. Ich hoffe einer von euch kann mir bitte helfen.

Worum gehts?

Ich habe eine Sparberechnung erstellt. (Online:  http://www.grassegger.at/winzinsen/form.php )

Wenn ich bei den Feldern folgendes eingebe:

Endwert: 500000
Laufzeit in Jahren: 15
Anzahl der Raten: Monatlich
Jährlicher Zinssatz in Prozent: 4.5

Erhalte ich einen korrekten Wert von 1.957,05

Wenn ich bei den Feldern diesmal folgendes eingebe:

Endwert: 500000
Laufzeit in Jahren: 15
Anzahl der Raten: Monatlich
Jährlicher Zinssatz in Prozent: 4,5 (Keinen Punkt sondern ein Komma)

Erhalte ich einen NICHT korrekten Wert von 2.285,30.

------------------------------------------------------

Ich habe nun versucht mittels ersetzens des Kommas durch einen Punkt,
das Problem zu lösen.

$p  = str_replace(",",".", $p);

Das hat geklappt. Leider verändert sich aber der errechnete Wert und ich weiß nicht wo ich den Fehler gemacht habe.

-------------------

Ich habe versucht Komma durch Punkt zu ersetzen und mittels verschiedener PHP Befehle (settype, + 0.0 [Um aus dem String eine Double zu machen],Casting,) den String in eine Double umzuwandeln.

Das funktioniert auch (rufe über gettype den Variablentyp ab),
sieht man nach dem Klick auf "Senden".

Leider berechnet das Script aber den Wert falsch (oder nicht den Wert, den ich haben will *g*), wenn ich ein Komma anstatt eine Zahl eingebe.

--------------------

Hätte bitte jemand einen Tip für mich was ich falsch mache?

Nachfolgend poste ich noch den Code der PHP Datei:

<?php

//Berechnung "Ein Bestimmtes Sparziel erreichen"

//$n  = Laufzeit
 //$p  = Zinssatz
 //$q  = p / 100 + 1
 //$i  = Anzahl Raten im Jahr
 //$ew = Endwert
 //$h  = benötigte Variable für die Berechnung
 //$ko = verwendete Nachkommastellen für alle bc Berechnungen

$n = $laufzeit;
 $p  = $zinssatz;
 $q  = $p / 100 + 1;
 $i  = $anzahl_raten;
 $ew = $endwert;
 $h  = 100;
 $ko = 6;

//Ersetzt das Komma durch einen Punkt.
 $p  = str_replace(",",".", $p);

$p = (double)$p;

echo (gettype($p). "<p>");

//Setzt 6 Nach-Kommastellen für alle bc-Berechnungen
 bcscale ($ko);

/*--------------------*/
 // Formel vorschüssig //
 /*--------------------*/

//Berechnung besteht aus 3 Teilabschnitten durch Klammern getrennt.
 //Siehe auch Formelblatt!!!
 //Die Abgrenzungen "<|" und "|>" dienen nur dem leichteren Verständnis und
 //müssen bei der Berechnung wieder entfernt werden.
 //$rate = $ew /(  <|( (($i + 1)/ 2) + ($i /($p / 100)) )|> * <|(pow($q, $n)-1)|>  );

/* ----------- TEILABSCHNITT 1 + TEILABSCHNITT 2 + TEILABSCHNITT 3 ----------- */

//Berechnung des 1. Teilabschnittes
 $teil1 =  bcdiv((bcadd($i, 1)), 2);

//Berechnung des 2. Teilabschnittes
 $teil2 =  bcdiv($i, (bcdiv($p, $h)));

//Berechnung des 3. Teilabschnittes
 $teil3 =  bcsub((bcpow($q, $n)), 1);

//Addition von $teil + $teil2
 $teil4 =  bcadd ($teil1, $teil2);

//Multiplikation von $teil4 mit $teil3
 $teil5 =  bcmul ($teil4, $teil3);

/* ----------- TEILABSCHNITT 1 + TEILABSCHNITT 2 + TEILABSCHNITT 3 ----------- */

/* ------------ Eigentliche Berechnung der Raten für das Sparziel ------------ */

//Den gewünschten Endwert dividiert durch $teil5 ergibt die monatliche Rate
 $rate = bcdiv($ew, $teil5);

/* ------------ Eigentliche Berechnung der Raten für das Sparziel ------------ */

//Hier wird auf 2 Kommastellen kaufmännisch gerundet.
    $rate = (round ($rate, 2));

//Formatiert die Ausgabe der in Europäische Werte 100.000.000,34
 echo (number_format($rate, 2,",", "."));

?>

Ich habe keinen blassen Schimmer, was ich falsch mache. :-(

Vielen Dank für eure Bemühungen.

mfg Rene

  1. Hi,

    $p  = $zinssatz;
    $q  = $p / 100 + 1;

    [...]

    $p  = str_replace(",",".", $p);

    fällt Dir was auf?

    Cheatah

    1. Hallo Cheatah,

      danke erstmals für deinen Denkanstoss. Ich hab ein wenig rumprobiert.
      Der Fehler war, dass $q auch mit den 4,5 gerechnet hat, weil str:replace erst später "eingreift".

      Ich habe $q unter str_replace gesetzt und es funktioniert mit Punkt und mit Komma.

      $n  = $laufzeit;
      $p  = $zinssatz;
      $i  = $anzahl_raten;
      $ew = $endwert;
      $h  = 100;
      $ko = 6;

      //Ersetzt das Komma durch einen Punkt.
      $p  = str_replace(",",".", $p);

      $q  = ($p / 100) + 1;

      Tausend Dank für deine Hilfe!

      Grüsse aus der Mozartstadt Salzburg

      Rene