Zinsen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Zinsen

Beitrag von AUGE_OHR »

hi,

ich hab wohl in Mathe damals nicht aufgepasst und Probleme
bei Zinsrechnung "pro Tag".

Also wenn ein Kunden für 10000,- gekauft hat und nach X Tage
nicht gezahlt hat so will ich ihm 8% Verzug Zinsen berechnen.

Nach 1 Jahr wäre es ja den 10800,-- , aber ich gehe davon mal
aus das der Kunden früher zahlt also brauche ich das für "jeden
weiteren Tag" den er im Verzug ist ...

ich schaffe es zwar "vorwärtz" in Jahren zu rechnen :

Code: Alles auswählen

PROCEDURE MAIN
CLS
nAmt=10000
nPercent=0.08
nCount=0
nYear=9        // 72/8 = 9
fCalc()
?
? 'Total: ', nAmt
WAIT
return .t.

function fCalc
nCount++
nAmt*=(1+nPercent)
? nCount,nAmt
if  nCount=nYear
  return .t.
else
    fCalc()
endif
return .t.
aber wie mache ich das "rückwärtz" auf z.b. 40 Tage ?

wer gibt mir bitte Mathe Nachhilfe ( möglist in XBase++ )

gruss by OHR
Jimmy
JanR
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 129
Registriert: Di, 18. Okt 2005 14:44

Beitrag von JanR »

Hi Jimmy,

teile die Jahreszinsen, in deinem Beispiel die 800,- Euro, einfach durch die Anzahl der Tage pro Jahr, also 365, und nehme das dann mal die Verzugstage. Dann hast du nur für die Verzugstage Zinsen berechnet.


Grüsse,
Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Vorsicht:
Banken (und damit gilt dies für die Zinsberechnungen) rechnen nur mit 360 Tagen / Jahr (bzw. 30 Tage / Monat)!!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Jimmy,

es gibt unter Excel eine Funktion mit der man die Zinsen
KORREKT berechnen kann:
  • Tage360( Ausgangsdatum,Enddatum,WAHR )
    WAHR=Europäische Methode
Beispiele
  • Tage360( 29.08.2006;30.08.2006;WAHR )=1
    Tage360( 29.08.2006;31.08.2006;WAHR )=1
    Tage360( 29.08.2006;01.09.2006;WAHR )=2
    Tage360( 29.08.2006;30.09.2006;WAHR )=31
    Tage360( 01.08.2006;01.09.2006;WAHR )=30
    Tage360( 01.02.2006;28.02.2006;WAHR )=27
    Tage360( 01.02.2006;01.03.2006;WAHR )=30
Den Zinsbetrag kann man so leicht errechnen:

Zinsbetrag = Betrag * Tage360( Ausgangsdatum;Enddatum;WAHR ) / 360 * Zinssatz

Realisierung von Tage360 in xBase (nicht geprüft):

Code: Alles auswählen

function Tage360( dAnfang,dEnde )
LOCAL nTage
  if dEnde<dAnfang
    nTage := 0
  else
    nTage := year( dEnde ) - year( dAnfang ) * 360
    nTage += month( dEande ) - month( dAnfang ) * 30
    nTage += min( 30,day( dEnde ) ) - min( 30,day( dAnfang ) )
  endif
return( nTage )
Viele Grüße

Uli
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi!

Nun, eine Zinsberechnung ist ziemlich simpel. Für eine unterjährige Verzinsung gilt:

Zinsen = (Kapital * (Zinssatz *0.01) * Zinstage) / 360

Wie Martin schon richtig angemerkt hat, erfolgt die Zinsberechnung auf Basis von 360 Tagen.

Code: Alles auswählen

// Berechnet die Zinsen (unterjährige Verzinsung) für einen Zeiraum
// Parameter:
//nKapital    = Betrag, auf dem die Zinsen berechnet werden sollen
//dDatumVon   = Angabe des Tages für den Begin der Zinsberechnung
//dDatumBis   = Datum des Endes der Zinsberechnung
//nSinsSatz   = Zinsatz in Prozent ( z.b 5% )

Func CalcUnterjaerhigeZinsen( nKapital, dDatumvon, dDatumbis, nSinzsatz)
Local nZins
Local nDiffTage := CalcDiffTage( dDatumvon, dDatumBis )

nZins := Round( nKapital * (nZinssatz*0.01) * nDiffTage ) / 360, 2)

Return ( nZins )


// Kurz und knackig
Func CalcDiffTage(dDate1, dDate2)
Local n1 := 30 -day( dDate1)
Local n2 := day( dDate2)

	IF  (dDate2 - dDate1) <= 30 
		IF Month( dDate1 ) == Month( dDate2)
			Return ( dDate2-dDate1)
		ENDIF
		Return ( n1 + n2 )
	ENDIF

	While ( ( dDate1 + ( n1  + 30 + n2) ) < dDate2 )
		n1+=30
	ENDDO

Return ( n1 + n2 )

PS: Alternativ kann die Funktion von Uli zur Differenzberechnung genommen werden.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Nachtrag:

In der Funktion "CalcDifftage" hat sich ein Fehler eingeschlichen. Richtig ist:

Code: Alles auswählen


Func CalcDiffTage( dDate1,  dDate2)
    Local n1 := 30 - day( dDate1 )
    Local n2 := Min(30, day( dDtate2))

    IF ( n2-n1) <= 30
          IF Month( dDate1) == Month( dDate2 )
              Return ( n2 - n1 )
           ENDIF
          Return ( n1 + n2 )
    ENDIF

    WHILE ( ( dDate1 + ( n1  + 30 + n2) ) < dDate2 )
         n1+=30
   ENDDO

Return ( n1 + n2 ) 

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Abgesehen davon, daß meine Routine übersichtlicher,
kürzer und wesentlich schneller ist :) , scheint mir
in CalcDiffTage noch ein Fehler drin zu sein:

z.B. bei dDate1=31.01.2006
und dDate2=01.02.2006

kommt nicht wie korrekt 1 raus, sondern 0.

Wahrscheinlich hilft

Code: Alles auswählen

Local n1 := Max( 30-day( dDate1 ) )
Uli
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Uli,
Ups...., ich stimme Dir zu. Meine Funktion "CalcDiffTage" ist nicht korrekt. Ich deshalb die Funktion wie unten abgebildet, neu überarbeitet.

Zu Deinem Lösungsansatz. Ich habe Deine hier beschrieben Funktion mit "Paste und Copy" übernommen und getestet. Wobei ich feststellen mußte, das Deine Funktion nur "unsinnige" Werte zurück gibt. Die einzige Änderung, die ich in Deiner Funktion vorgenommen habe, ist, dass ich "nTage := 0" initialisiert habe, da es sonst zu einem Laufzeitfehler kommt.

Mit Deiner Funktion erhalte ich folgenden Ergebnisse:

28.06.06 - 29.06.06 -> -720385 (Ergebnis CallDiffTage: 1)
28.02.08 - 01.03.08 -> -720956 (Ergebnis CalcDiffTage: 2) -> Schaltjahr
01.02.06 - 01.04.06 -> -720210 (Ergebnis CalcDiffTage: 58 ) -> kein Schaltjahr

Fazit: Deine Funktion ist zwar "elegant" aber auch falsch. *g*

Meine Funktion berücksichtig indes auch Schaltjahre!

Code: Alles auswählen



Func CalcDiffTage( dDate1,  dDate2)
    Local n1 := EoM(dDate1) - day( dDate1 )
    Local n2 := Min(30, day( dDate2))

    IF dDate2 - dDate1 <= 30
        IF Month( dDate1) == Month( dDate2 )
      	    Return ( dDate2 - dDate1 )
        ENDIF
        Return ( n1 + n2 )
    ENDIF

    WHILE ( ( dDate1 + ( n1  + 30 + n2) ) < dDate2 )
         n1+=30
   ENDDO

Return ( n1 + n2 )

*************************************************************
** Falls die xBase-Tools nicht verfügbar sind, wird hier die Funktion
** EoM() ->letzter Tag eines Monats ) nachgebildet
*************************************************************
Func Eom( dDate )
	Local nMon        := Month( dDate)
	Local cSysDate	:= DtoS( dDate)
	Local nRet         := 0

	IF nMon==2
		IF empty( StoD( SubStr( cSysDate,1,6) + "29"))  // Methode um festzustellen, 
                                                      //  ob der Februar in einem Schaltjahr liegt
			nRet := 28
		else
			nRet := 29
		endif
		Return ( nRet)
	ENDIF

	IF nMon == 1 .OR. nMon == 3 .OR. nMon == 5 .OR. nMon == 7 .OR. nMon == 8 .OR. nMon == 10 .OR. nMon ==12
		nRet := 31
	else
		nRet := 30
	ENDIF
Return ( nRet )
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,

danke erstmal allen für die Antworten. Das ich es einfach "nur" durch
"360" teilen muss ist natürlich einfach. (warum einfach wenn es auch
kompliziert geht ...)

gruss by OHR
Jimmy
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Jimmy,
wie Du an dem Thread siehst, ist die Bestimmung der zu verzinsenden Tage der entscheindene Punkt. Der Rest ist "Formsache".

Gruß, Olaf
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Jimmy,

es ist nicht ganz richtig, dass Du nur durch 360 Tage teilen mußt.
Erst ist die Frage zu klären, ob der erste Tag bzw. der letzte Tag mitgezählt wird. Bei Sparguthaben wird der erste Tag mitgezählt, der letzte aber nicht. Bei anderen Zinsberechnungen wie Kreditzinsen, Versugszinsen usw. ist es umgekehrt.
Nach der deutschen kaufmännischen Methode (nicht nach der europäischen) werden volle Monate immer mit 30 Tagen berechnet sowie die Tage des ersten und des letzten Monats, wenn dies keine vollen Monate sind.

Die Funktion von Lewie ergibt übrigens für 1.1.2006 - 31.5.2006 120 Tage.
Richtig ist: 150 Tage (ohne den ersten Tag, mit dem letzten) bzw. 150 Tage (ohne den letzten Tag, einschl. dem ersten Tag)

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Heinz.

Stimmt. Beim Tippen habe ich in der Funktion CalcDiffTage() ein "=" vergessen. Richtig wäre:

Code: Alles auswählen

WHILE ( ( dDate1 + ( n1  + 30 + n2) ) <= dDate2 )
         n1+=30
   ENDDO 

Nun gibt die Funktion für den "1.1.06" bis "30.05.06" auch 150 Tage zurück.


Anmerkung: Ob nun in Abhängigkeit von Sparzinsen oder Verzugszinsen, wie von Dir angeführt, der erste oder der letzte Tag berücksichtigt wird, scheint mir im Folgenden unerheblich, weil sich in beiden Fällen die Differenztage so oder nicht ändern würde. Wenn allerdings der erste und der letzte Tag verzinst werden, dann ergibt sich für die Differenzberechnung +1

Gruß, Olaf
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Lewi,

danke für den Hinweis.
Sicher hast Du auch schon bemerkt,
daß ich die nur die Klammern vergessen habe.
Punktrechnung geht schließlich vor Strichrechnung. :wink:

Hier die korrigierte Routine (diesmal getestet), die auch negative
Tagesdifferenzen berechnet (Schaltjahre werden natürlich
auch berücksichtigt):

Code: Alles auswählen

FUNCTION Tage360( dAnfang,dEnde )
RETURN( (year( dEnde)-year(dAnfang))*360+;
        (month(dEnde)-month(dAnfang))*30+;
         min(30,day(dEnde))-min(30,day(dAnfang)) )
Hallo Henxl,

ich habe mein Wissen nur von der Excelfunktion :( .

Kann man die Vorschriften (z.B. erster oder letzten Tag
mitzählen je nach Guthaben oder Kreditzinsen) irgendwo
nachlesen?

Uli
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Olaf,

das mit dem Abzug von einem Tag stimmt nicht. Es ist nicht unerheblich.
Beispiel:
Zinsberechnung für 1.2. - 1.3., kein Schaltjahr.
Wenn der erste Tag mitgezählt wird, der letzte aber nicht, hast Du einen vollen Monat, der mit 30 Tagen angesetzt wird.
Wenn der letzte Tag mitgezählt wird, der erste aber nicht, hast Du keinen vollen Monat, sondern 27 Tage im Februar und einen Tag im März, also 28 Tage.
Das kann niemand verstehen, ich weiß.

Ich habe die Funktion CalcDiffTage neu entwickelt. Die Funktion EOM() habe ich von Dir übernommen.

Code: Alles auswählen


FUNCTION CalcDiffTage( nModus, dDate1,  dDate2) 
    LOCAL lErsterMonatVoll, lLetzterMonatVoll, nVolleJahre, ;
    nVolleMonateJahr1, nVolleMonateJahr2, nVolleMonate, nTage, ;
    lDerselbeMonat

    
    IF     nModus == 0  // erster  Tag == dDate1 und 
                        // letzter Tag == dDate2  werden mitgerechnet,
        
    ELSEIF nModus == 1  // erster  Tag == dDate1 wird nicht mitgerechnet,
                        // letzter Tag == ddate2 wird       mitgerechnet
      dDate1 += 1

    ELSEIF nModus == 2  // erster  Tag == dDate1 wird       mitgerechnet,
                        // letzter Tag == ddate2 wird nicht mitgerechnet
      dDate2 -= 1
    ENDIF

    IF dDate2 < dDate1
      nTage := 0
      RETURN nTage
    ENDIF
    
    lDasselbeJahr     := ( YEAR(dDate1) == YEAR(dDate2) )
    lDerselbeMonat    := ( lDasselbeJahr  .AND. ;
                           ( MONTH(dDate1) == MONTH(dDate2)) )   
    lErsterMonatVoll  := ( ( DAY(dDate1) == 1 ) .AND. ;
            IF( lDerselbeMonat, ( DAY(dDate2) == EoM(dDate2) ), .T. ) )
    lLetzterMonatVoll := ( ( DAY(dDate2) == EoM(dDate2) ) .AND. ;
                           !lDerselbeMonat )

    IF lDerselbeMonat

      IF lErsterMonatVoll
        nTage := 30
      ELSE
        nTage := DAY(dDate2) - DAY(dDate1) + 1
      ENDIF

    ELSE

      nVolleJahre  := MAX( 0, YEAR(dDate2)-YEAR(dDate1) - 1 ) 
    
      nVolleMonateJahr1 := 12 - MONTH(dDate1) + ;
                           IF(lErsterMonatVoll, 1, 0 )
      nVolleMonateJahr2 := MONTH(dDate2) - ;
            IF(lLetzterMonatVoll, 0, 1) - IF( lDAsselbeJahr, 12, 0 ) 

      nTageMonat1 := IF(lErsterMonatVoll,  0, EoM(dDate1)-DAY(dDate1) + 1 )
      nTageMonat2 := IF(lLetzterMonatVoll, 0, DAY(dDate2) )

      nVolleMonate := ( nVolleJahre * 12 ) + ;
                        nVolleMonateJahr1 + nVolleMonateJahr2 

      nTage        := ( nVolleMonate * 30 )  +  nTageMonat1 +  nTageMonat2
    


    ENDIF

RETURN nTage 

Hier die EOM() von Olaf :

Code: Alles auswählen

************************************************************* 
** Falls die xBase-Tools nicht verfügbar sind, wird hier die Funktion 
** EoM() ->letzter Tag eines Monats ) nachgebildet 
************************************************************* 
Func Eom( dDate ) 
   Local nMon        := Month( dDate) 
   Local cSysDate   := DtoS( dDate) 
   Local nRet         := 0 

   IF nMon==2 
      IF empty( StoD( SubStr( cSysDate,1,6) + "29"))  // Methode um festzustellen, 
                                                      //  ob der Februar in einem Schaltjahr liegt 
         nRet := 28 
      else 
         nRet := 29 
      endif 
      Return ( nRet) 
   ENDIF 

   IF nMon == 1 .OR. nMon == 3 .OR. nMon == 5 .OR. nMon == 7 .OR. nMon == 8 .OR. nMon == 10 .OR. nMon ==12 
      nRet := 31 
   else 
      nRet := 30 
   ENDIF 
Return ( nRet ) 

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Uli,

Deine Funktion ergibt für das Beispiel 1.2.-1.3. (kein Schaltjahr) 30 Tage. Für den Fall, dass der erste Tag nicht mitgezählt wird und der letzte mitgezählt wird, ergeben sich aber nur 28 Tage.

Die Excel-Funktion rechnet nach der europäischen Methode, was das auch immer ist (französische oder englische ... ). Ich rechne nach der deutschen kaufmännischen Methode, die für Deutschland verbindlich ist.

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Uli,

sorry, habe Deine Frage vergessen.

Ich glaube nicht, dass es eine Gesetzesvorschrift gibt. Das BGB jedenfalls enthält keine definitive Berechnungsmethode. Es hat sich in der Rechtsprechung so herausgebildet.

Einen Überblick mit weiteren rechtlichen Hinweisen findest Du unter http://www.zinsmethoden.de

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Henxl,

danke für Deine Infos.
Besonders interessant finde ich, daß die Effektivzinsmethode von der exakten Anzahl der Tage im Jahr ausgeht. Bisher dachte ich, daß ebenfalls von 30 bzw. 360 Zinstagen dabei ausgegangen wird. Aber
hierum geht es ja nicht bei diesem Thema.

Bei der Deutschen (kaufmännischen) Methode finde ich, daß die Unterschiede zwischen Alt.1 und Alt.2 unvollständig erklärt sind.

Du schreibst bei Alt.1 (erster Tag nicht mitzählen, letzten Tag mitzählen) kommen beim Zeitraumf 1.2. - 1.3. (kein Schaltjahr) nur 28 Tage heraus.

Ich habe es so verstanden, daß bei Überschreiten der Monatsgrenze (1. Tag des Folgemonats wird mitgezählt) der zu untersuchende Monat bis zum 30. unabhängig von der tatsächlichen Anzahl der Tage gezählt wird.

Wenn ich Deine Routine richtig verstanden habe, werden Monate nur
dann mit 30 Tagen berücksichtigt, wenn ALLE Tage des Monats mitgezählt werden.
Richtig?

Uli

P.S. Das Thema ist richtig spannend, finde ich
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Uli,

Du hast mit Deiner Vermutung Recht, ich gehe davon aus, dass ein Monat nur dann mit 30 Tagen berücksichtigt wird, wenn alle Tage des Monats mitgezählt werden.
Deine vermutete Methode (Auf- oder Abzählen bis/auf 30, wenn der erste Tag des Folgemonats mitgezählt wird) kenne ich nicht. Wie ist es dann im folgenden Beispiel: 2.1. - 1.2. ? Januar: 30 minus 1 = 29 + ein Tag im Februar ergibt 30 Tage. Nach meiner Methode ergeben sich 31 Tage. Oder willst Du es nur auf den Februar anwenden ?

Leider ist die Frage der Berechnungsmethoden nur akademisch, denn viele Banken bzw. Firmen legen in ihren AGB eine bestimmte Methode fest. Diese gilt dann als vertraglich vereinbart.

Ich halte die taggenaue Berechnung (Effektivzinsmethode) für die einzig richtige.
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Uli,
bei der Ermittlung der Zinstage für 1.2.06 bis 1.3.06 vertrete ich eine andere Auffassung.

Das BGB regelt zwar nicht die Berechnungsmethode für die Zinsberechnung ( 360 vs. Kalendergenau), aber die Fristen. Da im Laufe der Diskussion die Anzahl der Zinstage variiert, möchte ich die Ermittlung der Zinstage näher beleuchten.

Code: Alles auswählen

BGB

§ 186  Frist- und Terminbestimmungen
Für die in Gesetzen, gerichtliche Verfügungen und Rechtsgeschäften enthaltenen Frist- und Terminbestimmungen gelten die Auslegungsvorschriften (§§ 187, 188 BGB)

§ 187 Fristanfang
(1)	Ist für den Anfang einer Frist ein Ergebnis oder ein in den Lauf eines Tages fallender Zeitpunkt maßgebend, so wird bei der Berechnung der Frist der Tag nicht mitgerechnet, in welches das Ergebnis oder der Zeitpunkt fällt.
(2)	Ist der Beginn eines Tages, der für den Anfang einer Frist maßgebener Zeitpunkt, so wird dieser Tag bei der Berechnung der Frist mitgerechnet…..

§ 188 Fristende
(1)   Eine nach Tagen bestimmte Frist endet mit dem Ablauf des letzten Tages der Frist.

Verzinsungsbeginn
Die Vorschriften des BGB regeln also die Fristen für die Ermittlung des Zinszeitraumes. Bei Verzugszinsen im kaufmännischem Bereich ist der Verzinsungsbeginn der erste Tag nach dem vereinbartem Zahlungsziel.

Beispiel: Zahlungsziel 31.1.06
Erster Verzinsungstag ist der 1.2. Dies ergibt sich aus §§ 187,Abs 2

Hingegen wird bei Abhebungen vom Girokonto bei Berechnung der Zinszeitraums der Tag der Abhebung nicht mitgezählt, da §§ 187, Abs. 1 zum tragen kommt
Bespiel: Der Kunde hebt am 31.1. einen Betrag ab, dann ist der erste Verzinsungstag der 1.2.


Verzinsungsende
Bei der bisherigen Diskussion wurde das Thema „Wertstellung“ außer Acht gelassen. Wertstellung ist der Tag (Valuta), der auf dem Ende der Verzinsung folgt.

Laut §§188 Abs. 1, endet der Zinszeitraum mit dem Ablauf des letzten Tages.

Darauf aufbauend wäre das Datum 1.3.06 im Zusammenhang kaufmännischer Geflogenheiten zu beleuchten.

Mahnung zum 1.3.
Eine zum „1.3“ erstelle Mahnung hat, wenn nicht anderes ausgewiesen, das Valutadatum (Werstellungsdatum) „1.3.“ und die Berechnung erfolgt postnumerandum. Wie oben dargelegt, ist das Wertstellungsdatum der folgende Tag des Zinsendes.
Die Mahnungsposition weist den Zinszeitraum vom 1.2. bis 28.02 aus und setzt dann 30 Zinstage auf Basis der 360er-Methode an.

Der Kunde zahlt am 1.3.
Dann kann der Lieferant 31 Zinstage abrechnen, weil §§ 188, Abs. 1 zum Tragen kommt.

Fazit:

Für einen „Zinszeitraum“ vom 1.2.06 bis 1.3.06 würde ich bei der Berechnung von kaufmännischen Verzugszinsen auf 31 Zinstage kommen (wenn Zahlungsziel 31.1).

Bei der Berechnung von Bankzinsen 30 Zinstage ansetzen, wenn der Kunde am 1.2. Geld abhebt und am 1.3 wieder einzahlt.


Gruß, Olaf
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Olaf,

die Fristenregelung des BGB würde der taggenauen Effektivzinsmethode entsprechen.
Aber wie läßt sich dann überhaupt die deutsche kaufmännische Methode (30 Tage pro Monat, 360 Tage pro Jahr) rechtfertigen ? Wahrscheinlich handelt es sich eine gewohnheitsrechtliches spezielles Recht, was der Fristenregelung des BGB vorgeht. Sonst dürfte ja niemend diese Methode anwenden, weil sie gegen das Gesetz verstoßen würde.

Deshalb glaube ich, dass die Fristenregelung des BGB insoweit nicht anwendbar ist, als volle Monate mit 30 Tagen und das ganze Jahr mit 360 Tagen anzusetzen ist.

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Heinz,

Einspruch! *g*

Die Vorschriften des BGB´s zu den Fristen sind unabhängig der Zinsberechnungsmethode. Vielmehr präjurizieren sie allein die Firstenbestimmung.
Der Gesetzgeber hat mit seinen Vorschriften die Berechnung des Zinszeitraumes vorgeschrieben, jedoch keine Vorschrift für die Ermittlung der Anzahl der Zinstage innerhalb eines Zeitraumes oder gar eine dezidierte Zinsberechnungsmethode.

Dies läßt wiederum Spielraum für unterschiedliche Berechnungsmethoden.

Für alle Berechungsmethoden gelten jedoch die Fristenbestimmungen!

Gruß, Olaf
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Heinz

Du hast geschrieben:
Deine vermutete Methode (Auf- oder Abzählen bis/auf 30, wenn der erste Tag des Folgemonats mitgezählt wird) kenne ich nicht.
Das hat mir keine Ruhe gelassen.
Ich habe versucht, in den AGBs der Deutschen Bank eine Beschreibung der Berechnung der Zinsen zu finden. Außer dem Hinweis 30/360-Methode bei den Spareinlagen habe ich nichts gefunden. Anhand der realen Kontoauszüge habe ich jedoch festgestellt, daß die Berechnun der Zinstage exakt nach meiner Formel erfolgt.

Daraufhin habe ich nach Internetseiten gesucht und bin fündig geworden.
Ich habe einen sehr guten Zinstagerechner gefunden:

http://www.zinsen-berechnen.de/zinstage-rechner.php

Zumindest dieser Rechner entspricht exakt meiner Formel (Zinsmethode 30/360). Inzwischen glaube ich, daß dies die allgemein benutzte Berechnungsart bei den Deutschen Banken ist und der Deutschen Kaufmännischen Methode entspricht. :happy3:

Uli
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Uli,

möglicherweise hast Du Recht ...

Ich werde mich in den nächsten Tagen nochmals damit beschäftigen.

Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Uli,

wir drehen uns im Kreis! *g*

Wie ich in meine Ausführung dargelegt habe, ergibt sich ein unterschiedlicher Zinszeitraum für Überziehungszinsen und kaufmännischen Verzugszinsen.

Ursache dafür sind die geltenen Firstbestimmungen des BGB!

Wenn Du am 1.2.06 Geld abhebst und Dein Konto überziehst dann ist der erste Zinstag der 2.2.

Bei kaufmännischen Verzugszinsen wird der 1.2. mitgerechnet, wenn das ursprüngliche Zahlungsziel der 31.1. war.

Für beide Vorgänge ist der Ende der Zinsbrechnung der 1.3.

Soweit so gut.

Und nun kam ich ins Grübeln, warum meine vorgeschlagene Methode CalcDiffTage() scheinbar nicht korrekt arbeitet. Bei der Bestimmung der Zinstage ist die Berechnungsmethode entscheidend. Es gibt 5(!) Methoden:

(1) 30 / 360
(2) 30(28/29) / 360
(3) act / 360
(4) act / 365
(5) act / act taggenau

Ich muß eingestehen, dass meine Code CalcDiffTage() (1) und (2) vermengt und somit nicht korrekt ist. Ob das Beispiel von Heinz korrekt ist und welche Berechnungsvorschrift es abdeckt, kann ich nicht beurteilen, weil der Orginalcode bei mir zu einem Laufzeitfehler führt.

Die folgende Funktion deckt nun die 30/360 Methode ab:

Code: Alles auswählen

Func CalcDiffTage30_360( dDate1,  dDate2)

	Local n1 := 0			// Differenz im Monat dDate1 ( Beginn)
	Local n2 := 0			// Differenz im letzten Monat ( dDate2)
	Local n3 := 0			// Differenztage Monate
	Local n4 := 0			// Differenztage Jahre


       IF MONTH( dDate1) == MONTH( dDate2 ) .and. ( YEAR( dDate1) ==  YEAR( dDate2) )
            IF MONTH( dDate1) == 2
                Return (  (dDate2-dDate1) +1)
            else
                 Return ( ( dDate2 - dDate1 ) +1 )
            ENDIF
        endif
        n1 := 31 - MIN(30, DAY( dDate1))
        n2 := MIN(30, DAY( dDate2 ) )

        IF YEAR( dDate2) > YEAR( dDate1 )
            n3 :=  (( 12- MONTH( dDate1) )  + ( MONTH( dDate2) -1 )  ) *30
            n4 := ((YEAR( dDate2)-YEAR(dDate1)) -1)    *360
        else
            n3 := ( MONTH(dDate2) - MONTH(dDate1) -1)*30
        ENDIF

Return ( n1+ n2+n3+n4 )

Ich habe die Funktion für verschiedene Daten nachgeprüft. Sie scheint jetzt fehlerfrei zu sein. Oder?

Gruß, Olaf

PS: Uli, versuche doch mal mit Deiner Funktion den Zeitraum 1.2.06 bis 15.5.07 zu berechen? Das sind 465 Tage. Auf wieviele Tage kommt Deine Funktion? Ich denke, Sie funktioniert nur bei Daten innerhalb eines Jahres.
henxl
UDF-Programmierer
UDF-Programmierer
Beiträge: 91
Registriert: Fr, 10. Feb 2006 19:46
Wohnort: Mannheim

Beitrag von henxl »

Hallo Olaf,

darf ich wissen, welchen Laufzeitfehler meine Routine bei Dir verursacht ?


Grüße

Heinz
Das einzige, was ich weiß ist, dass ich nichts weiß, Sokrates
Antworten