<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mehdi Kabbaj</title>
    <description>The latest articles on DEV Community by Mehdi Kabbaj (@tresor4k).</description>
    <link>https://dev.to/tresor4k</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3702098%2F5ae6324e-224f-46be-b3aa-4143635d573a.jpg</url>
      <title>DEV Community: Mehdi Kabbaj</title>
      <link>https://dev.to/tresor4k</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tresor4k"/>
    <language>en</language>
    <item>
      <title>Calculer un TAEG en JavaScript avec Newton-Raphson : la méthode propre</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Mon, 20 Apr 2026 19:46:01 +0000</pubDate>
      <link>https://dev.to/tresor4k/calculer-un-taeg-en-javascript-avec-newton-raphson-la-methode-propre-2835</link>
      <guid>https://dev.to/tresor4k/calculer-un-taeg-en-javascript-avec-newton-raphson-la-methode-propre-2835</guid>
      <description>&lt;p&gt;Le TAEG (Taux Annuel Effectif Global) d'un prêt immobilier n'admet pas de formule fermée. Il faut l'approcher par itérations successives à partir de la mensualité, du capital et de la durée. La méthode de Newton-Raphson converge en 4 à 8 itérations sur les profils classiques — bien plus rapide que la dichotomie utilisée dans la plupart des simulateurs JavaScript que j'ai audités en 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le problème mathématique
&lt;/h2&gt;

&lt;p&gt;On cherche le taux mensuel &lt;code&gt;r&lt;/code&gt; tel que :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;M = C × r × (1+r)^n / ((1+r)^n - 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Où &lt;code&gt;M&lt;/code&gt; = mensualité, &lt;code&gt;C&lt;/code&gt; = capital emprunté, &lt;code&gt;n&lt;/code&gt; = nombre d'échéances.&lt;/p&gt;

&lt;p&gt;Newton-Raphson revient à résoudre &lt;code&gt;f(r) = 0&lt;/code&gt; avec :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f(r) = C × r × (1+r)^n - M × ((1+r)^n - 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;et sa dérivée &lt;code&gt;f'(r)&lt;/code&gt; qui s'obtient par dérivation directe.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'implémentation JS minimale
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;taegMensuel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capital&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mensualite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.005&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;guess&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;capital&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;mensualite&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;capital&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;capital&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;mensualite&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;df&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// annualisation simple&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sur un prêt de 200 000 € à 1 160 €/mois sur 240 échéances, cette fonction converge en 5 itérations et rend &lt;code&gt;r ≈ 0.0348&lt;/code&gt; soit &lt;strong&gt;TAEG ≈ 3,48 %&lt;/strong&gt; — à comparer au 3,30 % affiché en taux nominal, l'écart représentant frais de dossier, assurance emprunteur et garantie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les pièges à éviter
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Guess initial trop bas&lt;/strong&gt; : si vous partez de 0,001 la convergence explose pour des mensualités élevées. Démarrer à 0,005 (= 6 % annuel) couvre 99 % des cas 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Division par zéro&lt;/strong&gt; : si &lt;code&gt;f'(r)&lt;/code&gt; approche 0, Newton-Raphson diverge. Ajouter un fallback dichotomique si &lt;code&gt;Math.abs(df) &amp;lt; 1e-6&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annualisation&lt;/strong&gt; : &lt;code&gt;r * 12&lt;/code&gt; est une simplification. Le TAEG officiel européen utilise &lt;code&gt;(1+r)^12 - 1&lt;/code&gt; (capitalisation composée). Vérifier lequel votre réglementation locale exige.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le HCSF impose en France un taux d'endettement maximal de 35 % incluant assurance, et une durée max de 25 ans. Intégrer ces contraintes dans le simulateur évite d'afficher des scenarios refusés d'emblée par les banques.&lt;/p&gt;

&lt;p&gt;Si ça t'intéresse de creuser, j'ai mis en ligne une version complète avec la méthode de capacité d'emprunt inverse, les tests HCSF et les zones PTZ 2026 : &lt;a href="https://macalculatriceenligne.com/finance/immobilier/pret-calcul/" rel="noopener noreferrer"&gt;approche détaillée et simulateur&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;— Mehdi Kabbaj&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>javascript</category>
      <category>finance</category>
      <category>frenchtech</category>
    </item>
  </channel>
</rss>
