<?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.us-east-2.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>Combien d'heures travaille-t-on légalement dans la francophonie ? Le match France / Belgique / Suisse / Québec / Luxembourg (202</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Fri, 19 Jun 2026 14:23:41 +0000</pubDate>
      <link>https://dev.to/tresor4k/combien-dheures-travaille-t-on-legalement-dans-la-francophonie-le-match-france-belgique--44pd</link>
      <guid>https://dev.to/tresor4k/combien-dheures-travaille-t-on-legalement-dans-la-francophonie-le-match-france-belgique--44pd</guid>
      <description>&lt;p&gt;On parle souvent des « 35 heures » comme d'une évidence française. Mais dès qu'on franchit une frontière francophone, le compteur change — et surtout, la façon dont vos heures supplémentaires sont payées change radicalement. J'ai compilé les chiffres officiels 2026 de cinq territoires dans un jeu de données ouvert. Voici ce qu'ils racontent.&lt;/p&gt;

&lt;h2&gt;
  
  
  La durée légale : de 35 h à 50 h, presque du simple au double
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Territoire&lt;/th&gt;
&lt;th&gt;Durée légale hebdomadaire&lt;/th&gt;
&lt;th&gt;Base mensuelle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;35 h&lt;/td&gt;
&lt;td&gt;151,67 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇧🇪 Belgique&lt;/td&gt;
&lt;td&gt;38 h&lt;/td&gt;
&lt;td&gt;~164,67 h (dérivé)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇦 Québec&lt;/td&gt;
&lt;td&gt;40 h&lt;/td&gt;
&lt;td&gt;173,33 h (dérivé)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇱🇺 Luxembourg&lt;/td&gt;
&lt;td&gt;40 h&lt;/td&gt;
&lt;td&gt;173 h (forfait légal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇭 Suisse&lt;/td&gt;
&lt;td&gt;45 h (industrie/bureau/vente) à 50 h (autres)&lt;/td&gt;
&lt;td&gt;quota annuel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La France reste le pays à la durée légale la plus courte. À l'autre bout du spectre, la Suisse autorise jusqu'à &lt;strong&gt;45 heures&lt;/strong&gt; dans l'industrie, les bureaux et le commerce de détail, et &lt;strong&gt;50 heures&lt;/strong&gt; dans tous les autres secteurs avant que la moindre majoration ne se déclenche. Entre une semaine légale française et une semaine suisse « autres secteurs », l'écart atteint 15 heures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le vrai sujet : qui paie le mieux la 41e heure ?
&lt;/h2&gt;

&lt;p&gt;C'est là que les systèmes divergent le plus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇧🇪 La Belgique est la plus protectrice.&lt;/strong&gt; Toute heure au-delà de 9 h/jour ou 40 h/semaine donne droit à un sursalaire de &lt;strong&gt;+50 % en semaine&lt;/strong&gt; (samedi compris) et de &lt;strong&gt;+100 % le dimanche et les jours fériés&lt;/strong&gt;. Par défaut, ces heures se récupèrent ; le salarié peut renoncer à la récupération pour toucher la majoration en cash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇨🇦 Le Québec joue simple et clair.&lt;/strong&gt; Au-delà de 40 h/semaine, c'est &lt;strong&gt;taux et demi (+50 %)&lt;/strong&gt;, point. Avec une option de remplacement par un congé payé équivalent (1 h 30 par heure supplémentaire).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇫🇷 La France module.&lt;/strong&gt; +25 % pour les 8 premières heures supplémentaires (de la 36e à la 43e), puis &lt;strong&gt;+50 %&lt;/strong&gt; à partir de la 44e. Le tout dans un contingent annuel de 220 heures par défaut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇱🇺 Le Luxembourg est intermédiaire.&lt;/strong&gt; Compensation par défaut en repos (1 h 30 par heure), ou paiement à &lt;strong&gt;140 % du salaire horaire&lt;/strong&gt;, soit &lt;strong&gt;+40 %&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇨🇭 La Suisse est la plus avare — et la plus piégeuse.&lt;/strong&gt; Le « travail supplémentaire » au-delà du maximum légal n'est majoré que de &lt;strong&gt;+25 %&lt;/strong&gt;… et seulement après un quota annuel non payé (170 h dans le régime 45 h, 140 h dans le régime 50 h). Attention au faux ami : en droit suisse, ces &lt;em&gt;heures supplémentaires de la loi sur le travail&lt;/em&gt; (Überzeit) sont distinctes des &lt;em&gt;heures supplémentaires contractuelles&lt;/em&gt; (art. 321c CO), qui relèvent du contrat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trois pièges concrets quand on calcule au-delà des frontières
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. La « base mensuelle » n'existe pas partout.&lt;/strong&gt; La France raisonne en 151,67 h/mois, le Luxembourg en 173 h (forfait officiel). Mais la Belgique raisonne par &lt;strong&gt;trimestre&lt;/strong&gt; (520 h = 13 × 40), pas par mois, et la Suisse fixe un &lt;strong&gt;plafond annuel&lt;/strong&gt; de travail supplémentaire. Convertir mécaniquement « semaine × 52 ÷ 12 » donne un ordre de grandeur, pas une valeur légale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Le seuil de déclenchement n'est pas toujours la durée légale.&lt;/strong&gt; En Belgique, le sursalaire se déclenche au-delà de 9 h/jour &lt;em&gt;ou&lt;/em&gt; 40 h/semaine — pas à 38 h. En Suisse, rien n'est majoré tant qu'on reste sous le maximum légal (45 ou 50 h).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Repos compensateur vs paiement.&lt;/strong&gt; Dans presque tous ces pays, l'employeur peut remplacer la majoration par du repos. Le calcul de paie change donc selon l'option retenue — d'où l'intérêt d'un outil qui gère les deux.&lt;/p&gt;

&lt;h2&gt;
  
  
  La formule, identique partout
&lt;/h2&gt;

&lt;p&gt;Quel que soit le pays, une fois le seuil et le taux connus, le calcul d'une heure supplémentaire est le même :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Heure sup. payée = taux horaire × (1 + majoration / 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple à 20 €/h : une heure supplémentaire vaut 25 € en France (1ʳᵉ tranche, +25 %), 28 € au Luxembourg (+40 %), 30 € au Québec et en Belgique (+50 %), et jusqu'à 40 € le dimanche en Belgique (+100 %).&lt;/p&gt;

&lt;h2&gt;
  
  
  Le jeu de données
&lt;/h2&gt;

&lt;p&gt;J'ai publié l'ensemble (durées légales, seuils, majorations, repos compensateur, base légale et sources officielles) en &lt;strong&gt;CSV ouvert sous licence CC BY 4.0&lt;/strong&gt;, vérifié ligne par ligne sur les sites gouvernementaux (Service-Public.gouv.fr, SPF Emploi, SECO, CNESST, Guichet.lu).&lt;/p&gt;

&lt;p&gt;Pour calculer directement un total hebdomadaire avec heures supplémentaires automatiques (mode « Semaine 35h »), j'utilise &lt;a href="https://macalculatriceenligne.com/temps-heures/calcul-heure/" rel="noopener noreferrer"&gt;ce calculateur d'heures et de temps de travail&lt;/a&gt;, qui gère la base 60, le passage minuit et la décomposition jour/nuit. Pour la partie paie, la conversion en &lt;a href="https://macalculatriceenligne.com/finance/salaire/calcul-salaire-brut-net/" rel="noopener noreferrer"&gt;salaire brut / net&lt;/a&gt; prend le relais.&lt;/p&gt;

&lt;p&gt;Sources : Service-Public.gouv.fr (DILA), SPF Emploi (Belgique), Secrétariat d'État à l'économie SECO (Suisse), CNESST (Québec) et Guichet.lu / ITM (Luxembourg).&lt;/p&gt;

</description>
      <category>data</category>
      <category>opendata</category>
      <category>france</category>
      <category>career</category>
    </item>
    <item>
      <title>Dental Costs Vary up to 2x Across Canada — and the CDCP Doesn't Cover the Gap</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Thu, 18 Jun 2026 16:06:16 +0000</pubDate>
      <link>https://dev.to/tresor4k/dental-costs-vary-up-to-2x-across-canada-and-the-cdcp-doesnt-cover-the-gap-65c</link>
      <guid>https://dev.to/tresor4k/dental-costs-vary-up-to-2x-across-canada-and-the-cdcp-doesnt-cover-the-gap-65c</guid>
      <description>&lt;p&gt;The Canadian Dental Care Plan (CDCP) now helps millions of residents, but two things surprise people: dental fees vary widely &lt;strong&gt;by province&lt;/strong&gt;, and the plan &lt;strong&gt;doesn't cover everything&lt;/strong&gt;. We compiled an open, per-province cost index for nine core procedures (in CAD) and cross-referenced each to CDCP coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a single implant costs across Canada
&lt;/h2&gt;

&lt;p&gt;A complete single implant (fixture + abutment + crown) ranges from about &lt;strong&gt;$3,000 in Manitoba&lt;/strong&gt; to &lt;strong&gt;$6,100 in Newfoundland and Labrador&lt;/strong&gt;. Ontario publishes the only official breakdown: fixture $1,375 + abutment $575 + crown $1,099 + lab ≈ &lt;strong&gt;$4,165&lt;/strong&gt;. And implants are an &lt;strong&gt;absolute CDCP exclusion&lt;/strong&gt; — you pay 100% out of pocket regardless of income.&lt;/p&gt;

&lt;h2&gt;
  
  
  The coverage gap most guides miss
&lt;/h2&gt;

&lt;p&gt;The CDCP reimburses on its &lt;strong&gt;own established fees&lt;/strong&gt;, which are often lower than a dentist's actual charge. So even at the under-$70,000 income tier (100% coinsurance), a balance can remain. Income tiers: under $70,000 = 100%, $70,000–$79,999 = 60%, $80,000–$89,999 = 40%, $90,000+ = not eligible.&lt;/p&gt;

&lt;p&gt;Covered (no pre-auth): exams, scaling, fillings, extractions, standard root canals, complete dentures. Partial (pre-auth): crowns, cast partial dentures. &lt;strong&gt;Not covered&lt;/strong&gt;: implants, implant crowns, bridges, veneers, whitening, night guards, bone grafts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore the full data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://realdentalcosts.com/ca/" rel="noopener noreferrer"&gt;Dental costs in Canada by province (2026)&lt;/a&gt; — interactive CDCP out-of-pocket calculator&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realdentalcosts.com/ca/cdcp-coverage/" rel="noopener noreferrer"&gt;What the CDCP covers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realdentalcosts.com/ca/dental-cost-by-province/" rel="noopener noreferrer"&gt;Per-province cost index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realdentalcosts.com/ca/dental-implants-cost/" rel="noopener noreferrer"&gt;Dental implant cost by province&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open dataset (CSV, CC BY 4.0) with DOI &lt;strong&gt;10.5281/zenodo.20744781&lt;/strong&gt;. Figures are taken from the 2025–2026 provincial suggested-fee guides; cells modelled where a guide is members-only are flagged as estimates. This is pricing/market research, &lt;strong&gt;not medical or dental advice&lt;/strong&gt;, and is not affiliated with the Government of Canada.&lt;/p&gt;

</description>
      <category>canada</category>
      <category>healthcare</category>
      <category>data</category>
      <category>dentistry</category>
    </item>
    <item>
      <title>Les taux de TVA en francophonie en 2026 : France, Belgique, Suisse et Québec comparés</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Sat, 13 Jun 2026 13:35:54 +0000</pubDate>
      <link>https://dev.to/tresor4k/les-taux-de-tva-en-francophonie-en-2026-france-belgique-suisse-et-quebec-compares-2ipa</link>
      <guid>https://dev.to/tresor4k/les-taux-de-tva-en-francophonie-en-2026-france-belgique-suisse-et-quebec-compares-2ipa</guid>
      <description>&lt;p&gt;Si vous vendez en ligne au-delà de vos frontières ou facturez des clients dans plusieurs pays francophones, une question revient vite : &lt;strong&gt;quel taux de TVA appliquer ?&lt;/strong&gt; Les écarts sont plus grands qu'on ne le pense. Voici un comparatif 2026 à partir des barèmes officiels, que j'ai compilés dans un jeu de données ouvert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le tableau des taux 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Territoire&lt;/th&gt;
&lt;th&gt;Taux normal / standard&lt;/th&gt;
&lt;th&gt;Taux réduits / spéciaux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;20 %&lt;/td&gt;
&lt;td&gt;10 % · 5,5 % · 2,1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇧🇪 Belgique&lt;/td&gt;
&lt;td&gt;21 %&lt;/td&gt;
&lt;td&gt;12 % · 6 % · 0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇭 Suisse&lt;/td&gt;
&lt;td&gt;8,1 %&lt;/td&gt;
&lt;td&gt;3,8 % (hébergement) · 2,6 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇦 Québec&lt;/td&gt;
&lt;td&gt;14,975 % (TPS 5 % + TVQ 9,975 %)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La Suisse a le taux normal le plus bas de la francophonie (8,1 %), la Belgique le plus élevé (21 %).&lt;/p&gt;

&lt;h2&gt;
  
  
  Trois pièges concrets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. La Suisse n'est plus à 7,7 %.&lt;/strong&gt; Depuis le 1ᵉʳ janvier 2024, le taux normal est passé à &lt;strong&gt;8,1 %&lt;/strong&gt;, le réduit à 2,6 % et le spécial hébergement à 3,8 %. Beaucoup de modèles de factures traînent encore l'ancien taux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Le Québec, ce sont deux taxes, pas une.&lt;/strong&gt; On additionne la &lt;strong&gt;TPS fédérale (5 %)&lt;/strong&gt; et la &lt;strong&gt;TVQ provinciale (9,975 %)&lt;/strong&gt;, toutes deux calculées sur le prix hors taxes — soit &lt;strong&gt;14,975 %&lt;/strong&gt; au total. Depuis 2013, la TVQ ne se calcule plus « en cascade » sur la TPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. La France a relevé le gaz et l'électricité.&lt;/strong&gt; Depuis le 1ᵉʳ août 2025, le taux réduit de 5,5 % sur les abonnements d'énergie est supprimé : c'est désormais &lt;strong&gt;20 %&lt;/strong&gt;. Aucune autre hausse générale en 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  La formule, une fois pour toutes
&lt;/h2&gt;

&lt;p&gt;Quel que soit le pays, le calcul TTC est le même :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TTC = HT × (1 + taux / 100)
HT  = TTC / (1 + taux / 100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple pour 100 € HT : 120 € TTC en France (20 %), 121 € en Belgique (21 %), 108,10 CHF en Suisse (8,1 %). Au Québec, 100 $ HT donnent 114,975 $ une fois la TPS et la TVQ ajoutées.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le jeu de données
&lt;/h2&gt;

&lt;p&gt;J'ai publié l'ensemble (taux, catégories, base légale, sources officielles) en CSV ouvert sous licence CC BY 4.0, avec un DOI citable : &lt;a href="https://doi.org/10.5281/zenodo.20679859" rel="noopener noreferrer"&gt;Barèmes de TVA en francophonie 2026 (Zenodo)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour calculer directement, j'utilise &lt;a href="https://macalculatriceenligne.com/finance/impots/calcul-tva/calcul-tva/" rel="noopener noreferrer"&gt;cette calculatrice de TVA en ligne&lt;/a&gt; ; pour le cas particulier belge (21/12/6/0 %), il y a une &lt;a href="https://macalculatriceenligne.com/belgique/calcul-tva-belgique/" rel="noopener noreferrer"&gt;page dédiée au calcul de la TVA en Belgique&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sources : DGFiP, SPF Finances, Administration fédérale des contributions (AFC), Revenu Québec et l'Agence du revenu du Canada.&lt;/p&gt;

</description>
      <category>finance</category>
      <category>data</category>
      <category>opendata</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Calculer des heures en base 60 sans se tromper : la méthode des minutes totales</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Sat, 13 Jun 2026 11:10:00 +0000</pubDate>
      <link>https://dev.to/tresor4k/calculer-des-heures-en-base-60-sans-se-tromper-la-methode-des-minutes-totales-501k</link>
      <guid>https://dev.to/tresor4k/calculer-des-heures-en-base-60-sans-se-tromper-la-methode-des-minutes-totales-501k</guid>
      <description>&lt;p&gt;Additionner des heures n'est pas comme additionner des nombres : &lt;strong&gt;1h45 + 2h30 ≠ 3h75, mais 4h15&lt;/strong&gt;. La cause, c'est la base 60.&lt;/p&gt;

&lt;p&gt;La parade fiable des développeurs et des gestionnaires de paie : &lt;strong&gt;convertir chaque durée en minutes totales&lt;/strong&gt; avant toute opération, puis reconvertir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toMinutes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;// 3h45 -&amp;gt; 225&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                      &lt;span class="c1"&gt;// sur les minutes, sans retenue&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toHHMM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&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;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;h&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&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;toDecimal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// paie : 7h15 = 7.25, jamais 7.15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les 3 pièges classiques
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Excel plafonne à 24h&lt;/strong&gt; si le format de cellule n'est pas &lt;code&gt;[h]:mm&lt;/code&gt; (les crochets sont obligatoires pour cumuler au-delà d'une journée).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Le passage de minuit&lt;/strong&gt; : si l'heure de fin est antérieure au début, la durée vaut &lt;code&gt;(1440 - début) + fin&lt;/code&gt; (en minutes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;La conversion décimale&lt;/strong&gt; : on divise les &lt;strong&gt;minutes&lt;/strong&gt; par 60, pas le chiffre après l'heure. 7h45 → 45/60 = 0,75 → &lt;strong&gt;7,75&lt;/strong&gt;, pas 7,45.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Heures supplémentaires (France)
&lt;/h3&gt;

&lt;p&gt;Base légale 35h/semaine, puis +25 % de la 36ᵉ à la 43ᵉ heure et +50 % au-delà. Là encore, on raisonne en minutes totales avant d'appliquer les taux.&lt;/p&gt;

&lt;p&gt;J'ai détaillé la méthode complète en 5 étapes et un calculateur 6 modes (addition, soustraction, conversion décimal, durée entre deux horaires avec passage minuit, total semaine 35h, heures de nuit selon convention collective) ici :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://macalculatriceenligne.com/temps-heures/calcul-heure/" rel="noopener noreferrer"&gt;Calculatrice d'heures — méthode complète&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Et vous, quelle méthode utilisez-vous pour les feuilles de temps en masse ?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>excel</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Dental Prices and Dental Coverage Are Uncorrelated Across US States (r = -0.04) — New Open Dataset</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Fri, 12 Jun 2026 12:33:29 +0000</pubDate>
      <link>https://dev.to/tresor4k/dental-prices-and-dental-coverage-are-uncorrelated-across-us-states-r-004-new-open-dataset-blp</link>
      <guid>https://dev.to/tresor4k/dental-prices-and-dental-coverage-are-uncorrelated-across-us-states-r-004-new-open-dataset-blp</guid>
      <description>&lt;p&gt;Six weeks ago we published the &lt;a href="https://doi.org/10.5281/zenodo.20531729" rel="noopener noreferrer"&gt;US Dental Cost Index by State 2026&lt;/a&gt;, a 51-jurisdiction dataset of real dental prices. The most common question we got from readers was not about prices. It was: &lt;em&gt;"fine, dental care is cheaper in Alabama — but will anyone there actually take my insurance?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is a different dataset. So we built it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US Dental Insurance Acceptance by State 2026&lt;/strong&gt; — DOI: &lt;a href="https://doi.org/10.5281/zenodo.20666358" rel="noopener noreferrer"&gt;10.5281/zenodo.20666358&lt;/a&gt; (CC BY 4.0, also on &lt;a href="https://figshare.com/articles/dataset/US_Dental_Insurance_Acceptance_by_State_2026_/32660274" rel="noopener noreferrer"&gt;figshare&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in it
&lt;/h2&gt;

&lt;p&gt;One row per state (50 + DC), combining five public sources that, as far as we know, had never been joined in one table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;% of dentists enrolled as Medicaid/CHIP providers&lt;/strong&gt; — ADA Health Policy Institute, 2024 data. National average: 41.2%. Range: 21.9% (Nevada) to 76.2% (Delaware).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adult Medicaid dental benefit level&lt;/strong&gt; — the standard CareQuest/MACPAC classification (&lt;code&gt;none&lt;/code&gt; / &lt;code&gt;emergency_only&lt;/code&gt; / &lt;code&gt;limited&lt;/code&gt; / &lt;code&gt;extensive&lt;/code&gt;), updated for the seven 2025 state expansions (GA, IN, KS, KY, OK, MO, UT). Current distribution: 1 none, 5 emergency-only, 7 limited, 38 extensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annual dollar caps&lt;/strong&gt; on the adult benefit where they exist (8 states, from $500 in Arkansas to $2,000 in West Virginia).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;% of adults with dental insurance&lt;/strong&gt; (CareQuest State of Oral Health Equity 2024) and &lt;strong&gt;% with a past-year dental visit&lt;/strong&gt; (CDC BRFSS 2024).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACA marketplace stand-alone dental plan availability&lt;/strong&gt;, plan year 2026 (parsed from the CMS QHP landscape file for all healthcare.gov states).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These roll up into a transparent composite &lt;strong&gt;Insurance Acceptance Index&lt;/strong&gt; (100 = national average), computed exactly like our Cost Index: ratios against the national mean, averaged, no hidden weights. Every input is in the CSV, so you can re-weight it however you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding that surprised us
&lt;/h2&gt;

&lt;p&gt;We expected coverage to track prices at least loosely — richer states, higher prices, better benefits. The actual correlation between the Dental Cost Index and the Insurance Acceptance Index is &lt;strong&gt;r = -0.04&lt;/strong&gt;. Essentially zero.&lt;/p&gt;

&lt;p&gt;The quadrants are where it gets interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alabama&lt;/strong&gt; is the cheapest state for dental care in the country (Cost Index 76) &lt;em&gt;and&lt;/em&gt; one of the five weakest coverage profiles (Acceptance Index 77) — it is the only state left with no general adult Medicaid dental benefit at all. Cheap care does not help you if nothing is covered and only a third of dentists take Medicaid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nevada, Florida and Arizona&lt;/strong&gt; sit at the bottom (Acceptance Index 63): emergency-only adult benefits and the country's lowest dentist participation rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iowa&lt;/strong&gt; is the outlier in the good direction: prices 19% below the national average &lt;em&gt;and&lt;/em&gt; the highest Acceptance Index (131) — 75.7% of its dentists are enrolled Medicaid providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are modeling out-of-pocket dental risk for US households, price and coverage need to be separate variables. Using one as a proxy for the other is, per this data, just noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dataset + methodology + chart: &lt;a href="https://zenodo.org/records/20666358" rel="noopener noreferrer"&gt;zenodo.org/records/20666358&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Companion price dataset: &lt;a href="https://realdentalcosts.com/en/us-dental-cost-index/" rel="noopener noreferrer"&gt;US Dental Cost Index by State 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Consumer-facing guides built on this data: &lt;a href="https://realdentalcosts.com/en/dental-insurance/" rel="noopener noreferrer"&gt;dental insurance guides&lt;/a&gt;, &lt;a href="https://realdentalcosts.com/en/does-medicaid-cover-dental/" rel="noopener noreferrer"&gt;what Medicaid covers in each state&lt;/a&gt;, and a free &lt;a href="https://realdentalcosts.com/en/compare/" rel="noopener noreferrer"&gt;state-vs-state cost comparison tool&lt;/a&gt; with cash / PPO / savings-plan modes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Known limitations are documented in the README (the ADA participation metric best represents child Medicaid/CHIP programs; the insured-adults share is a survey estimate; no state-level "skipped care because of cost" series exists anywhere — we checked).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pricing and coverage market research, not medical advice. Questions about the methodology welcome in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>opendata</category>
      <category>healthcare</category>
      <category>data</category>
    </item>
    <item>
      <title>What 51 US jurisdictions reveal about dental prices (open dataset + DOI)</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Wed, 03 Jun 2026 19:39:20 +0000</pubDate>
      <link>https://dev.to/tresor4k/what-51-us-jurisdictions-reveal-about-dental-prices-open-dataset-doi-5891</link>
      <guid>https://dev.to/tresor4k/what-51-us-jurisdictions-reveal-about-dental-prices-open-dataset-doi-5891</guid>
      <description>&lt;p&gt;I spend my time on an unglamorous question: &lt;strong&gt;how much does dental care actually cost, and why does the same procedure cost wildly different amounts depending on where you live?&lt;/strong&gt; To answer it with data instead of anecdotes, our team built the &lt;strong&gt;US Dental Cost Index&lt;/strong&gt; — average implant, veneer and braces prices for all 50 US states + DC in 2026 — and released the whole thing as an open CSV. Here's what the numbers say, and how you can grab the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: geography, not clinical complexity, drives the gap
&lt;/h2&gt;

&lt;p&gt;A single dental implant averages &lt;strong&gt;$3,759 in Alabama&lt;/strong&gt; and &lt;strong&gt;$5,733 in California&lt;/strong&gt; — a ~$2,000 swing for the &lt;em&gt;same&lt;/em&gt; procedure. The cheapest cluster (Alabama, Arkansas, Mississippi) sits ~24% below the national average; the priciest (California, New York, Hawaii) runs well above it.&lt;/p&gt;

&lt;p&gt;The interesting part is &lt;em&gt;why&lt;/em&gt;. When you plot each state's composite dental &lt;strong&gt;Cost Index&lt;/strong&gt; against its &lt;strong&gt;cost-of-living index&lt;/strong&gt;, you get a Pearson correlation of &lt;strong&gt;r = 0.835&lt;/strong&gt; — a strong, clean relationship. In plain terms: dental fees track local rent, wages and overhead far more than they track anything clinical. The tooth doesn't care what state it's in; the lease on the building does.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the index is built
&lt;/h2&gt;

&lt;p&gt;For each of the 51 jurisdictions the dataset reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;average &lt;strong&gt;single implant&lt;/strong&gt; price (with low/high range)&lt;/li&gt;
&lt;li&gt;average &lt;strong&gt;per-tooth veneer&lt;/strong&gt; price&lt;/li&gt;
&lt;li&gt;average &lt;strong&gt;full-course braces&lt;/strong&gt; price&lt;/li&gt;
&lt;li&gt;a composite &lt;strong&gt;Cost Index&lt;/strong&gt; = mean of each procedure ÷ its national average × 100 (so 100 = the US average)&lt;/li&gt;
&lt;li&gt;the state &lt;strong&gt;cost-of-living index&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;affordability&lt;/strong&gt; access-and-value score (0–100)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Cost Index is deliberately simple and reproducible: no black box, just each procedure normalized to its national average and averaged. Methodology is documented here → &lt;strong&gt;&lt;a href="https://realdentalcosts.com/en/us-dental-cost-index/" rel="noopener noreferrer"&gt;US Dental Cost Index methodology&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the data (CSV, CC BY 4.0)
&lt;/h2&gt;

&lt;p&gt;The full dataset is open and free to reuse with attribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Landing page + interactive ranking:&lt;/strong&gt; &lt;a href="https://realdentalcosts.com/en/us-dental-cost-index/" rel="noopener noreferrer"&gt;https://realdentalcosts.com/en/us-dental-cost-index/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citable DOI (Zenodo):&lt;/strong&gt; &lt;a href="https://doi.org/10.5281/zenodo.20531729" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.20531729&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Also mirrored on Kaggle, data.world and Hugging Face if those are your preferred tools.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;implant&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;implant&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;low&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;implant&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;high&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;veneer&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;braces&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;cost&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;cost&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;living&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;affordability&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;score&lt;/span&gt;
&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Alabama&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3759&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2631&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;5263&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;940&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3007&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;76&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;88.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;50&lt;/span&gt;
&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Arkansas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3833&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2683&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;5366&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;958&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3066&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;86&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;62&lt;/span&gt;
&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Mississippi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;MS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3885&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2720&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;5439&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;971&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;54&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this matters beyond a trivia stat
&lt;/h2&gt;

&lt;p&gt;If you're uninsured (about 1 in 4 American adults have no dental coverage), the $2,000 implant gap is actionable: dental tourism &lt;em&gt;within the US&lt;/em&gt;, dental school clinics, and savings plans all become rational moves once you can see the price surface. We keep a companion guide to &lt;a href="https://realdentalcosts.com/en/free-dental-care-by-state/" rel="noopener noreferrer"&gt;free and low-cost dental care by state&lt;/a&gt; for exactly that reason.&lt;/p&gt;

&lt;p&gt;And for anyone doing health-economics or cost-of-living analysis, the 0.835 correlation is a tidy, citable data point — the CSV is small, clean and ready to drop into a notebook.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is market and pricing research, not clinical or treatment advice. Data compiled by the Real Dental Costs Data &amp;amp; Research Team. Free to cite with a link to the source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>data</category>
      <category>healthcare</category>
      <category>opendata</category>
    </item>
    <item>
      <title>Charges auto-entrepreneur 2026 : la formule exacte que tu peux coder en 12 lignes</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Wed, 13 May 2026 12:13:00 +0000</pubDate>
      <link>https://dev.to/tresor4k/charges-auto-entrepreneur-2026-la-formule-exacte-que-tu-peux-coder-en-12-lignes-3afn</link>
      <guid>https://dev.to/tresor4k/charges-auto-entrepreneur-2026-la-formule-exacte-que-tu-peux-coder-en-12-lignes-3afn</guid>
      <description>&lt;p&gt;Si tu es freelance dev, comptable amateur, ou simplement curieux du fonctionnement réel des cotisations URSSAF, tu as déjà tapé "calcul charges auto-entrepreneur" dans Google. Tu as trouvé trois calculateurs en ligne, deux articles d'experts-comptables, et zéro formule claire. C'est un défaut classique du contenu fiscal français : on te donne le résultat, pas la mécanique. Voyons la mécanique pour 2026, avec un exemple de code Python qui rend le calcul transparent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les trois lignes du calcul
&lt;/h2&gt;

&lt;p&gt;Pour un auto-entrepreneur en France métropolitaine en 2026, le brut de cotisations sociales se résume à trois taux selon le type d'activité :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vente de marchandises (BIC vente)&lt;/strong&gt; : 12,3 % du chiffre d'affaires&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prestations de services commerciales/artisanales (BIC services)&lt;/strong&gt; : 21,2 %&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activités libérales (BNC)&lt;/strong&gt; : 23,1 % (taux relevé en 2024 dans le cadre de la convergence Cipav, 24,6 % cible 2026 selon décret)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces taux ont évolué plusieurs fois ces dernières années. Le taux libéral est passé de 22,2 % à 23,1 % en 2025, puis 24,6 % en 2026 — soit deux marches en deux ans pour rapprocher progressivement les auto-entrepreneurs en BNC du régime général des indépendants. Vérifie toujours le taux en vigueur à la date de ta déclaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et la CFP — la ligne oubliée
&lt;/h2&gt;

&lt;p&gt;À ces cotisations sociales s'ajoute la &lt;strong&gt;Contribution à la Formation Professionnelle (CFP)&lt;/strong&gt;, plafonnée et calculée séparément :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commerçants : 0,1 % du CA&lt;/li&gt;
&lt;li&gt;Prestataires de services : 0,2 % du CA&lt;/li&gt;
&lt;li&gt;Professions libérales : 0,2 % du CA&lt;/li&gt;
&lt;li&gt;Artisans : 0,3 % du CA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est minuscule par rapport au taux principal, mais c'est obligatoire et souvent oublié. Beaucoup de calculateurs en ligne l'omettent dans le total, ce qui donne une estimation systématiquement sous-évaluée de quelques euros par mois.&lt;/p&gt;

&lt;h2&gt;
  
  
  La formule complète en Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;charges_auto_entrepreneur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ca_mensuel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Retourne les charges URSSAF + CFP pour 1 mois donné.

    activite ∈ {&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_cipav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;taux_social&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.212&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_cipav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# 2026
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.231&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}[&lt;/span&gt;&lt;span class="n"&gt;activite&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;taux_cfp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vente&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_cipav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}[&lt;/span&gt;&lt;span class="n"&gt;activite&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;cotisations_sociales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;taux_social&lt;/span&gt;
    &lt;span class="n"&gt;cfp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;taux_cfp&lt;/span&gt;
    &lt;span class="n"&gt;total_charges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cotisations_sociales&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cfp&lt;/span&gt;
    &lt;span class="n"&gt;net_apres_charges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;total_charges&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ca&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cotisations_sociales&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cotisations_sociales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cfp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_charges&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_charges&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;net_apres_charges&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;net_apres_charges&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;taux_effectif&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total_charges&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ca_mensuel&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;# Exemple : freelance dev à 5000 € CA/mois en libéral CIPAV
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;charges_auto_entrepreneur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liberal_cipav&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# {'ca': 5000, 'cotisations_sociales': 1230.0, 'cfp': 10.0,
#  'total_charges': 1240.0, 'net_apres_charges': 3760.0,
#  'taux_effectif': 0.248}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;12 lignes, plus de mystère. Un dev qui fait 5 000 € de CA mensuel en libéral CIPAV en 2026 paie 1 240 € de charges URSSAF + CFP, soit 24,8 % effectif.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le piège du seuil de TVA
&lt;/h2&gt;

&lt;p&gt;Un point crucial pour 2026 : le seuil de franchise TVA pour les services est de 36 800 € de CA annuel (37 500 € marchandises). Au-delà, &lt;strong&gt;TVA obligatoire&lt;/strong&gt; — et tu factures TTC ou tu absorbes la TVA dans ta marge. Beaucoup d'auto-entrepreneurs dépassent ce seuil un mois avant de s'en rendre compte, parce qu'ils raisonnent sur leurs "revenus" plutôt que sur le CA cumulé sur 12 mois glissants (la règle réelle).&lt;/p&gt;

&lt;p&gt;Conseil pratique pour ne pas te faire piéger : tiens un tableau Excel qui calcule ton CA glissant sur 12 mois à chaque facture. Quand tu approches 35 000 €, anticipe la bascule TVA — ça change tout (devis HT/TTC, comptabilité, déclarations).&lt;/p&gt;

&lt;h2&gt;
  
  
  L'impôt sur le revenu — le calcul séparé
&lt;/h2&gt;

&lt;p&gt;Les charges URSSAF + CFP couvrent uniquement les cotisations sociales. &lt;strong&gt;L'impôt sur le revenu est calculé séparément&lt;/strong&gt;, soit en barème classique (avec abattement forfaitaire de 50 % BIC services, 71 % BIC vente, 34 % BNC), soit en versement libératoire (option chiffrée selon le RFR du foyer N-2).&lt;/p&gt;

&lt;p&gt;Le versement libératoire ajoute 1 % (vente), 1,7 % (services BIC) ou 2,2 % (BNC) au taux URSSAF, et c'est tout — pas de déclaration IR séparée derrière. Avantage : prévisible. Inconvénient : tu paies de l'impôt même si ton foyer est non-imposable au final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et la couverture sociale dans tout ça ?
&lt;/h2&gt;

&lt;p&gt;Les cotisations payées via URSSAF couvrent :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maladie-maternité-décès&lt;/li&gt;
&lt;li&gt;Allocations familiales&lt;/li&gt;
&lt;li&gt;Retraite (base + complémentaire pour CIPAV ou général selon activité)&lt;/li&gt;
&lt;li&gt;Invalidité-décès&lt;/li&gt;
&lt;li&gt;CSG-CRDS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pas de chômage (option Madelin séparée et coûteuse). Pas de prévoyance optionnelle (à souscrire à part). Pas d'AT/MP couvert. Sur un revenu confortable, beaucoup de freelances complètent avec une assurance santé privée + une prévoyance individuelle, ce qui peut coûter 100 à 300 € supplémentaires par mois.&lt;/p&gt;

&lt;h2&gt;
  
  
  L'outil de simulation complet
&lt;/h2&gt;

&lt;p&gt;La formule ci-dessus suffit pour un cas simple. Si tu veux comparer plusieurs scénarios (mix d'activités, basculement vers la SASU au-delà d'un certain CA, simulation versement libératoire vs barème), le calculateur en ligne &lt;a href="https://macalculatriceenligne.com/finance/calcul-charges-auto-entrepreneur/" rel="noopener noreferrer"&gt;charges auto-entrepreneur 2026&lt;/a&gt; propose un outil complet avec graphique de seuil de bascule.&lt;/p&gt;

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

</description>
      <category>tutorial</category>
      <category>finance</category>
      <category>french</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Puissance triphasée : les 5 erreurs de calcul qui faussent 40% des installations industrielles, avec le code de correction</title>
      <dc:creator>Mehdi Kabbaj</dc:creator>
      <pubDate>Thu, 23 Apr 2026 11:24:33 +0000</pubDate>
      <link>https://dev.to/tresor4k/puissance-triphasee-les-5-erreurs-de-calcul-qui-faussent-40-des-installations-industrielles-32bg</link>
      <guid>https://dev.to/tresor4k/puissance-triphasee-les-5-erreurs-de-calcul-qui-faussent-40-des-installations-industrielles-32bg</guid>
      <description>&lt;p&gt;Dans un réseau électrique triphasé, la puissance active &lt;code&gt;P&lt;/code&gt; consommée par une charge équilibrée se calcule par la formule académique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P = U × I × √3 × cos(φ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;où &lt;code&gt;U&lt;/code&gt; est la tension entre phases (400V en France), &lt;code&gt;I&lt;/code&gt; l'intensité de ligne, &lt;code&gt;√3 ≈ 1,732&lt;/code&gt;, et &lt;code&gt;cos(φ)&lt;/code&gt; le facteur de puissance (typiquement 0,85 à 0,95 pour un usage industriel normal, qui peut descendre à 0,70 en charge partielle avec électronique moderne).&lt;/p&gt;

&lt;p&gt;Ça paraît simple et académique. Et pourtant, j'ai audité en 2026 une quinzaine de simulateurs en ligne et une douzaine de devis d'installateurs électriciens pour des chantiers industriels. Cinq erreurs récurrentes produisent des calculs faux de 20 à 40 % par rapport à la réalité du terrain. Cet article les détaille avec le code JavaScript de correction et les conséquences concrètes sur le dimensionnement de vos installations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreur 1 : confondre tension simple et tension composée
&lt;/h2&gt;

&lt;p&gt;En France, le réseau de distribution ENEDIS livre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;230 V entre phase et neutre&lt;/strong&gt; (tension simple, ou "phase-neutre")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;400 V entre phases&lt;/strong&gt; (tension composée, ou "phase-phase")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La relation mathématique est &lt;code&gt;U_composée = U_simple × √3&lt;/code&gt;, soit &lt;code&gt;400 = 230 × 1,732&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La formule avec √3 utilise la tension COMPOSÉE. Si on veut utiliser la tension simple, la formule devient :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Avec tension composée (correct)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;P_v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;U_composee&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;I&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;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cosphi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Avec tension simple (correct aussi)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;P_v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;U_simple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cosphi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les deux formes donnent le même résultat à 0,1 % près (arrondis numériques). Mathématiquement, &lt;code&gt;U_composée × √3 = 3 × U_simple&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le piège classique dans les simulateurs&lt;/strong&gt; : combiner une tension simple (230 V) avec le facteur √3 dans la même formule. Cela produit un résultat faussé de &lt;code&gt;√3&lt;/code&gt; (soit 73 % de trop). Un électricien qui applique incorrectly &lt;code&gt;230 × I × √3 × 0.9&lt;/code&gt; obtient une puissance affichée supérieure de 1,73× à la réalité. Dimensionnement surévalué, coût excessif, parfois incompatibilité avec l'abonnement souscrit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Règle mnémotechnique&lt;/strong&gt; : √3 avec 400V, ou 3× avec 230V. Jamais les deux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreur 2 : ignorer le déséquilibre triphasé
&lt;/h2&gt;

&lt;p&gt;La formule &lt;code&gt;P = √3 × U × I × cos(φ)&lt;/code&gt; suppose une charge &lt;strong&gt;parfaitement équilibrée&lt;/strong&gt; sur les 3 phases. Dans un atelier artisanal ou une PME industrielle réelle, les charges ne sont JAMAIS équilibrées au millimètre : une machine à commande numérique sur phase L1, un compresseur sur L2, éclairage + ventilation sur L3.&lt;/p&gt;

&lt;p&gt;Pour une charge déséquilibrée, il faut calculer phase par phase :&lt;br&gt;
&lt;/p&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;puissanceDesequilibree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;U_simple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;I1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;I2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;I3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cosphi1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cosphi2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cosphi3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// U_simple = tension phase-neutre (230V en France)&lt;/span&gt;
  &lt;span class="c1"&gt;// Chaque phase est traitée comme une charge monophasée&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;P1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;U_simple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;I1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cosphi1&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;P2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;U_simple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;I2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cosphi2&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;P3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;U_simple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;I3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;cosphi3&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;P1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;P2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;P3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Exemple: atelier avec 3 charges différentes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;P&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;puissanceDesequilibree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// 15A sur phase L1 (compresseur)&lt;/span&gt;
  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// 8A sur phase L2 (CNC)&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;// 12A sur phase L3 (éclairage + ventilation)&lt;/span&gt;
  &lt;span class="mf"&gt;0.88&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// P = 230×15×0.88 + 230×8×0.92 + 230×12×0.95 = 3036 + 1693 + 2622 = 7351W&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le calculateur typique qui dit "votre atelier consomme X kW" sur la base de la formule idéale sous-estime la puissance réelle de 10 à 25 % dans les ateliers réels. Surtout, il ne permet PAS de détecter le phénomène de &lt;strong&gt;perte Joule accrue&lt;/strong&gt; lié au déséquilibre : les pertes dans les conducteurs augmentent au carré de l'intensité, donc un déséquilibre fort (ex : 15A vs 4A vs 9A) produit des pertes supérieures à ce que donnerait la somme théorique équilibrée.&lt;/p&gt;

&lt;p&gt;Le TURPE 7 (Tarif d'utilisation du réseau 2026) impose aux installations tertiaires un taux de déséquilibre maximum de 5 %. Au-delà, l'installateur doit équilibrer les charges entre phases au prix d'un recalcul complet des courants de ligne, ce qui peut nécessiter une intervention sur le tableau électrique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreur 3 : valeur par défaut du cos(φ) trop optimiste
&lt;/h2&gt;

&lt;p&gt;Autre piège : les simulateurs appliquent souvent un cos(φ) de 0,90 ou 0,95 par défaut, correspondant à une installation "idéale". Sur des installations modernes avec beaucoup d'électronique (variateurs de vitesse, LED drivers, électronique de puissance, onduleurs), le cos(φ) peut descendre à 0,70-0,75 en charge partielle.&lt;/p&gt;

&lt;p&gt;La puissance apparente &lt;code&gt;S = U × I × √3&lt;/code&gt; atteint alors 1 400 VA pour une puissance active réelle de 1 000 W. Le tarif vert (facturation sur l'énergie réactive pour les clients grands comptes &amp;gt; 36 kVA) facture explicitement ce différentiel.&lt;/p&gt;

&lt;p&gt;Exemple chiffré. Un atelier de mécanique avec 6 machines CNC variateurs inclut fréquemment :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cos(φ) moyen en charge pleine : 0,89&lt;/li&gt;
&lt;li&gt;cos(φ) moyen en charge 30 % (soirée, week-end) : 0,72&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour une puissance apparente identique S = 25 kVA, la puissance active varie de 22,3 kW (charge pleine) à 18 kW (charge partielle). Le différentiel de 4,3 kVA en réactive est facturé en surcoût sur les factures tarif vert. Sur 2 000 heures d'usage partiel annuel, le surcoût peut atteindre 300-500 €.&lt;/p&gt;

&lt;p&gt;Un calculateur qui ignore la variabilité du cos(φ) sous-estime le coût réel de l'installation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreur 4 : confondre kW et kVA dans le dimensionnement
&lt;/h2&gt;

&lt;p&gt;Toute installation triphasée doit être dimensionnée sur la puissance &lt;strong&gt;APPARENTE&lt;/strong&gt; &lt;code&gt;S&lt;/code&gt; (en kVA), pas sur la puissance active &lt;code&gt;P&lt;/code&gt; (en kW). Une erreur classique : dimensionner un onduleur pour 10 kW de puissance active alors qu'il faut 14 kVA en apparent si cos(φ) = 0,71.&lt;/p&gt;

&lt;p&gt;Le triangle des puissances :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    S (kVA) puissance apparente
                   ╱│
                 ╱  │
               ╱    │ Q (kVAR) puissance réactive
             ╱      │
           ╱        │
         ╱──────────┘
        P (kW) puissance active

S² = P² + Q²
cos(φ) = P/S
tan(φ) = Q/P
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un onduleur 10 kW "actif" avec un cos(φ) client de 0,71 ne peut fournir que 7,1 kW utiles sur une charge typique. Il faut dimensionner 14 kVA pour espérer servir 10 kW.&lt;/p&gt;

&lt;p&gt;Cette erreur est particulièrement fréquente sur les projets de groupes électrogènes de secours. Un générateur 50 kVA ne fournit PAS 50 kW en continu à toutes les charges. Selon le cos(φ) de l'installation, la puissance utile peut varier entre 35 et 48 kW.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonction JavaScript complète pour dimensionnement&lt;/strong&gt; :&lt;br&gt;
&lt;/p&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;dimensionnerOnduleur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;charges&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// charges = [{P_active_W, cosphi}, ...]&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;P_total&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;S_total&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;charges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;P_total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;P_active_W&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;S_total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;P_active_W&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cosphi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// S = P/cos(φ)&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;cosphi_global&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;P_total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;S_total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;P_active_total_kW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;P_total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;S_apparent_total_kVA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;S_total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cosphi_moyen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cosphi_global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;dimensionnement_recommande_kVA&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;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S_total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// +20% marge&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le 20 % de marge protège contre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Démarrage des charges inductives (moteurs qui absorbent 5-8× leur intensité nominale pendant 100-500 ms)&lt;/li&gt;
&lt;li&gt;Évolution future des charges (+10-15 % en 3-5 ans typiquement)&lt;/li&gt;
&lt;li&gt;Coefficient de simultanéité (pics ponctuels non prévus)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Erreur 5 : oublier le facteur d'utilisation et de simultanéité
&lt;/h2&gt;

&lt;p&gt;Tous les équipements branchés sur une installation ne fonctionnent pas à pleine puissance en même temps. En pratique, on applique deux coefficients :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Facteur d'utilisation Ku&lt;/strong&gt; : rapport entre la puissance consommée par un équipement et sa puissance nominale. Typiquement 0,6 à 0,9 selon le type d'équipement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Facteur de simultanéité Ks&lt;/strong&gt; : rapport entre la puissance maximale absorbée simultanément par un groupe d'équipements et la somme de leurs puissances nominales individuelles.&lt;/p&gt;

&lt;p&gt;Pour une installation industrielle typique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moteurs : Ks = 0,85 (5 moteurs sur la même phase, Ks descend à 0,80)&lt;/li&gt;
&lt;li&gt;Éclairage : Ks = 1,0 (tout allumé en même temps)&lt;/li&gt;
&lt;li&gt;Prises de courant : Ks = 0,20 à 0,40 (usage intermittent)&lt;/li&gt;
&lt;li&gt;Climatisation : Ks = 0,70 en été, 0,30 en hiver
&lt;/li&gt;
&lt;/ul&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;calculerPuissanceSimultanee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;equipements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// equipements = [{P_nominale_kW, Ku, Ks}, ...]&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;equipements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;P_nominale_kW&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Ku&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Ks&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Exemple: PME 10 postes bureautique + 3 imprimantes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charges&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="na"&gt;P_nominale_kW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Ku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Ks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// 10 postes&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;P_nominale_kW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Ku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Ks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// 3 imprimantes&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// Pour 10 postes + 3 imprimantes&lt;/span&gt;
&lt;span class="c1"&gt;// Puissance réelle : 10×(0.3×0.8×0.9) + 3×(0.5×0.6×0.3) = 2.16 + 0.27 = 2.43 kW&lt;/span&gt;
&lt;span class="c1"&gt;// vs puissance nominale brute : 10×0.3 + 3×0.5 = 4.5 kW&lt;/span&gt;
&lt;span class="c1"&gt;// Ratio = 2.43 / 4.5 = 54% seulement&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La plupart des installations sont dimensionnées sur la puissance nominale brute, ce qui produit une surévaluation de 50-70 % et donc des abonnements surfacturés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le triangle des puissances appliqué à la production renouvelable
&lt;/h2&gt;

&lt;p&gt;Cas spécifique 2026 : beaucoup de PMI installent des panneaux photovoltaïques en auto-consommation. L'installation produit de l'énergie active (kW) qui doit être synchronisée avec les charges en consommation active et apparente.&lt;/p&gt;

&lt;p&gt;Si l'installation PV produit 8 kW crête et que l'usage local consomme 15 kVA avec cos(φ) = 0,88, la situation devient :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consommation active locale : 15 × 0,88 = 13,2 kW&lt;/li&gt;
&lt;li&gt;Consommation réactive : sqrt(15² - 13,2²) = 7,1 kVAR&lt;/li&gt;
&lt;li&gt;Production PV : 8 kW (uniquement active, les onduleurs PV produisent en général avec cos(φ) = 1)&lt;/li&gt;
&lt;li&gt;Consommation active nette (à tirer du réseau) : 13,2 − 8 = 5,2 kW&lt;/li&gt;
&lt;li&gt;Consommation réactive (toujours à tirer du réseau) : 7,1 kVAR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Même avec des panneaux PV, le client continue à tirer de l'énergie réactive sur le réseau tarif vert. Un calculateur qui oublie cette dimension sous-estime la facture nette post-installation PV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour aller plus loin : intégration NFC 15-100
&lt;/h2&gt;

&lt;p&gt;La norme française NFC 15-100 impose des règles strictes sur le dimensionnement des canalisations électriques en fonction de la puissance maximale possible. Le calcul de puissance doit être fait sur la puissance APPARENTE maximale anticipée, avec prise en compte :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Courant nominal par conducteur (en fonction de la section cuivre utilisée)&lt;/li&gt;
&lt;li&gt;Chute de tension admissible (&amp;lt; 3 % pour éclairage, &amp;lt; 5 % pour autres usages)&lt;/li&gt;
&lt;li&gt;Protection différentielle et disjoncteur calibré sur In * k (k = coefficient thermique)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un tableur Excel ou un simulateur en ligne doit, pour être conforme NFC, intégrer ces trois dimensions simultanément. La plupart des simulateurs grand public ne le font pas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonction JavaScript complète et production-ready
&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;calculInstallationTriphasee&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;U_composee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;U_simple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;charges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="c1"&gt;// [{nom, P_nominale_W, cosphi, Ku, Ks}, ...]&lt;/span&gt;
  &lt;span class="nx"&gt;typeReseau&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// TT, TN-S, TN-C, IT&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;P_total_nominale&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;P_total_simultanee&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;S_total_simultanee&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;charges&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;P_simultanee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;P_nominale_W&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Ku&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Ks&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mf"&gt;0.9&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;S_simultanee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;P_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cosphi&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;P_total_nominale&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;P_nominale_W&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;P_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;P_simultanee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;S_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;S_simultanee&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;cosphi_global&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;P_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;S_total_simultanee&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;I_ligne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;S_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;U_composee&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;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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;Q_reactive&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;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;P_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;P_nominale_kW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;P_total_nominale&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;P_simultanee_kW&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;P_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;S_apparente_kVA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;Q_reactive_kVAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Q_reactive&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;cosphi_moyen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cosphi_global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;I_ligne_A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;I_ligne&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;dimensionnement_abonnement_kVA&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;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;S_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;coefficient_foisonnement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;P_total_simultanee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;P_total_nominale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette fonction gère les 5 erreurs listées et produit des résultats conformes NFC 15-100 + TURPE 7. Elle peut être intégrée dans un simulateur web ou une application mobile pour électriciens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Récapitulatif des 5 erreurs et leurs impacts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Erreur&lt;/th&gt;
&lt;th&gt;Impact typique&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;U simple + √3&lt;/td&gt;
&lt;td&gt;Surestimation 73 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Ignorer déséquilibre&lt;/td&gt;
&lt;td&gt;Sous-estimation 15-25 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;cos(φ) trop optimiste&lt;/td&gt;
&lt;td&gt;Sous-estimation 10-20 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;kW ≠ kVA&lt;/td&gt;
&lt;td&gt;Sous-dimensionnement 30-40 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Oublier Ku/Ks&lt;/td&gt;
&lt;td&gt;Surestimation 50-70 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;L'accumulation de ces erreurs peut produire des installations sous-dimensionnées (équipements qui tombent en panne) ou sur-dimensionnées (factures abonnement excessives pendant 10-15 ans).&lt;/p&gt;

&lt;p&gt;Pour calculer votre installation réelle avec puissance active, apparente, réactive, déséquilibre et triangle des puissances complet intégrant les 5 corrections — &lt;a href="https://macalculatriceenligne.com/electricite/calculateur-puissance-triphase/" rel="noopener noreferrer"&gt;simulateur triphasé détaillé conforme NFC 15-100 et TURPE 7&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Références : norme NFC 15-100 édition 2023, guide UTE C15-105, documentation TURPE 7 ENEDIS, directive européenne 2004/108/CE (CEM), Code de la construction et de l'habitation art. R123-12 pour ERP.&lt;/p&gt;

&lt;p&gt;— Thomas&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>javascript</category>
      <category>electrical</category>
      <category>french</category>
    </item>
    <item>
      <title>Calculer un TAEG en JavaScript avec Newton-Raphson : convergence, pièges et intégration HCSF 35%</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 analytique. Il faut l'approcher par itérations numériques successives à partir de la mensualité, du capital et de la durée connus. La méthode de Newton-Raphson converge en 4 à 8 itérations sur les profils classiques, contre 30 à 60 itérations pour la dichotomie naïve utilisée dans la plupart des simulateurs JavaScript que j'ai audités en 2026. L'écart de performance compte quand on veut animer un graphique en temps réel ou calculer plusieurs scénarios en parallèle côté client.&lt;/p&gt;

&lt;p&gt;Cet article détaille l'algorithme Newton-Raphson, les écueils de convergence, l'implémentation JavaScript production-ready, l'intégration des contraintes HCSF (taux d'endettement 35 %, durée max 25 ans) et les pièges courants qui faussent les simulateurs grand public.&lt;/p&gt;

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

&lt;p&gt;Pour un prêt à mensualité constante, la relation liant le capital emprunté &lt;code&gt;C&lt;/code&gt;, la mensualité &lt;code&gt;M&lt;/code&gt;, le taux mensuel &lt;code&gt;r&lt;/code&gt;, et la durée &lt;code&gt;n&lt;/code&gt; (en mois) est :&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;Cette équation n'est pas inversible analytiquement pour &lt;code&gt;r&lt;/code&gt;. On doit la réécrire sous forme de recherche de zéro :&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) = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Newton-Raphson recherche le zéro de &lt;code&gt;f&lt;/code&gt; en itérant :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r_{k+1} = r_k - f(r_k) / f'(r_k)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;où la dérivée &lt;code&gt;f'(r)&lt;/code&gt; se calcule par dérivation directe (fastidieux mais mécanique).&lt;/p&gt;

&lt;h2&gt;
  
  
  Dérivation de f'(r)
&lt;/h2&gt;

&lt;p&gt;Dérivons &lt;code&gt;f(r) = C × r × (1+r)^n - M × ((1+r)^n - 1)&lt;/code&gt; par rapport à &lt;code&gt;r&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pour le premier terme &lt;code&gt;C × r × (1+r)^n&lt;/code&gt;, on applique la règle du produit :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Pour le second terme &lt;code&gt;-M × ((1+r)^n - 1)&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;D'où :&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 × (1+r)^n × (1 + n × r / (1+r)) - M × n × (1+r)^n / (1+r)
      = (1+r)^n × [C + C × n × r / (1+r) - M × n / (1+r)]
      = (1+r)^(n-1) × [C × (1+r) + C × n × r - M × n]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  L'implémentation JavaScript 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="nx"&gt;tolerance&lt;/span&gt; &lt;span class="o"&gt;=&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="nx"&gt;maxIter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&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="nx"&gt;maxIter&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="nx"&gt;tolerance&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="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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Convergence non atteinte mais valeur approchée renvoyée&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;annualiser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r_mensuel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Taux annuel équivalent avec capitalisation composée (standard TAEG européen)&lt;/span&gt;
  &lt;span class="k"&gt;return&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_mensuel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&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="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.00290&lt;/code&gt;, soit &lt;strong&gt;TAEG ≈ 3,54 %&lt;/strong&gt; une fois annualisé.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les 4 pièges de convergence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Piège 1 : Guess initial trop bas
&lt;/h3&gt;

&lt;p&gt;Si vous partez de &lt;code&gt;guess = 0.0001&lt;/code&gt; (taux annuel 0,12 %), la convergence explose pour des mensualités élevées. Newton-Raphson peut diverger dans certains cas. Démarrer à &lt;code&gt;guess = 0.005&lt;/code&gt; (6 % annuel) couvre 99 % des cas 2026 et converge rapidement.&lt;/p&gt;

&lt;p&gt;Pour les cas extrêmes (taux &amp;gt; 8 % annuel, durée &amp;lt; 5 ans), un guess de 0.01 fonctionne mieux.&lt;/p&gt;

&lt;h3&gt;
  
  
  Piège 2 : Division par zéro
&lt;/h3&gt;

&lt;p&gt;Si &lt;code&gt;f'(r)&lt;/code&gt; approche zéro, Newton-Raphson diverge avec des valeurs de &lt;code&gt;r&lt;/code&gt; absurdes (infinies ou négatives). Cela arrive typiquement quand la mensualité est proche de la situation "remboursement total en une mensualité" (durée très courte) ou quand le capital est très faible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt; : ajouter un fallback dichotomique si &lt;code&gt;Math.abs(df) &amp;lt; 1e-6&lt;/code&gt;.&lt;br&gt;
&lt;/p&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;taegRobuste&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="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Essayer Newton-Raphson d'abord&lt;/span&gt;
  &lt;span class="k"&gt;try&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;r_newton&lt;/span&gt; &lt;span class="o"&gt;=&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isFinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r_newton&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;r_newton&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;r_newton&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="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_newton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="c1"&gt;// Fallback dichotomique&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.00001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&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;100&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;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&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;mid&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;mid&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="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;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.01&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;mid&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="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;&amp;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;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nx"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mid&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Piège 3 : Annualisation incorrecte
&lt;/h3&gt;

&lt;p&gt;Une simplification fréquente : &lt;code&gt;taeg_annuel = r_mensuel × 12&lt;/code&gt;. C'est FAUX. Le TAEG officiel européen utilise la capitalisation composée : &lt;code&gt;(1+r)^12 - 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sur un taux mensuel de 0,29 %, la simplification donne 3,48 % alors que le TAEG réel est 3,54 %. L'écart paraît faible mais sur un prêt de 300 000 € sur 25 ans représente des milliers d'euros d'erreur cumulée.&lt;/p&gt;

&lt;h3&gt;
  
  
  Piège 4 : Frais annexes non intégrés
&lt;/h3&gt;

&lt;p&gt;Le TAEG officiel inclut les frais de dossier, l'assurance emprunteur, les frais de garantie, en plus des intérêts. Un simulateur qui calcule le taux "contractuel" sans frais sous-estime le vrai coût du crédit.&lt;/p&gt;

&lt;p&gt;Solution : intégrer les frais en modifiant le capital effectivement emprunté.&lt;br&gt;
&lt;/p&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;taegComplet&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;capital_emprunte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;mensualite_hors_frais&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;duree_mois&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;frais_dossier&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;assurance_mensuelle&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;frais_garantie&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="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Le capital effectif reçu par l'emprunteur = capital brut - frais instantanés&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;capital_effectif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;capital_emprunte&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;frais_dossier&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;frais_garantie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// La mensualité totale payée = mensualité contractuelle + assurance&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mensualite_totale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mensualite_hors_frais&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;assurance_mensuelle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&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_effectif&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mensualite_totale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duree_mois&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Intégration des contraintes HCSF
&lt;/h2&gt;

&lt;p&gt;Le Haut Conseil de Stabilité Financière impose depuis 2022 deux règles aux banques françaises :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Taux d'endettement maximal 35 %&lt;/strong&gt; : la mensualité totale (principal + intérêts + assurance obligatoire) ne peut excéder 35 % des revenus nets du foyer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Durée maximale 25 ans&lt;/strong&gt; (27 ans pour primo-accédants résidence principale).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le HCSF autorise 20 % de dérogation trimestrielle à ces règles par banque. En pratique, les primo-accédants en résidence principale obtiennent facilement la dérogation si le taux d'endettement est juste au-dessus de 35 %.&lt;br&gt;
&lt;/p&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;evaluerHCSF&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;revenus_nets_mensuels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mensualite_totale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duree_mois&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;taux_endettement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mensualite_totale&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;revenus_nets_mensuels&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;duree_annees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;duree_mois&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;taux_endettement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;taux_endettement&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;duree_annees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;duree_annees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;conforme_standard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;taux_endettement&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;duree_annees&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;conforme_derogation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;taux_endettement&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.10&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;duree_annees&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;taux_usure_2026&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0552&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Taux d'usure T1 2026, actualisé trimestriellement&lt;/span&gt;
    &lt;span class="na"&gt;respecte_usure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// À calculer avec le TAEG obtenu&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le taux d'usure 2026 du T1 est de &lt;strong&gt;5,52 %&lt;/strong&gt; selon la publication Banque de France du 1er janvier 2026. Ce taux évolue chaque trimestre et doit être mis à jour dans le simulateur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculer la capacité d'emprunt inverse
&lt;/h2&gt;

&lt;p&gt;Un cas fréquent : l'emprunteur connaît ses revenus et veut savoir le capital maximum empruntable.&lt;/p&gt;

&lt;p&gt;Problème : la formule relie &lt;code&gt;M = C × r × (1+r)^n / ((1+r)^n - 1)&lt;/code&gt;. Résolvons pour &lt;code&gt;C&lt;/code&gt; sachant &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;n&lt;/code&gt;, et &lt;code&gt;M_max&lt;/code&gt; calculée par HCSF :&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Pour un couple à 5 000 € de revenus nets, taux 3,5 %, durée 25 ans, assurance 0,25 % :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;M_max HCSF = 5 000 × 0,35 = 1 750 €&lt;/li&gt;
&lt;li&gt;Moins assurance estimée (≈ 60 €) = 1 690 € dispo pour mensualité principale&lt;/li&gt;
&lt;li&gt;r = 0,035 / 12 = 0,002917&lt;/li&gt;
&lt;li&gt;n = 300 mois&lt;/li&gt;
&lt;li&gt;C = 1 690 × ((1+r)^300 - 1) / (r × (1+r)^300)&lt;/li&gt;
&lt;li&gt;C ≈ &lt;strong&gt;339 000 €&lt;/strong&gt; de capacité d'emprunt maximale&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Évaluer le coût total du crédit
&lt;/h2&gt;

&lt;p&gt;Une fois le TAEG calculé, le coût total peut être estimé :&lt;br&gt;
&lt;/p&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;coutTotalCredit&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;duree_mois&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;frais_dossier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;frais_garantie&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;total_paye&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;duree_mois&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;frais_dossier&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;frais_garantie&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;interets_et_frais&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;total_paye&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;capital&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;total_paye_par_emprunteur&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;total_paye&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;capital_recu&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="na"&gt;cout_credit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;interets_et_frais&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ratio_cout_capital&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interets_et_frais&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour notre emprunt 200 000 € / 1 160 € / 240 mois avec 1 500 € frais dossier + 1 800 € frais garantie :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total payé : 1 160 × 240 + 1 500 + 1 800 = 281 700 €&lt;/li&gt;
&lt;li&gt;Capital reçu : 200 000 €&lt;/li&gt;
&lt;li&gt;Coût du crédit : 81 700 €&lt;/li&gt;
&lt;li&gt;Ratio : 40,85 %&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce ratio varie typiquement entre 30 % (prêts courts à bas taux) et 70 % (prêts longs à taux élevés).&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparaison avec d'autres algorithmes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dichotomie pure&lt;/strong&gt; : simple à coder, 30-60 itérations pour converger. Acceptable pour un calcul ponctuel, trop lent pour un simulateur temps réel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Méthode sécante&lt;/strong&gt; : une variante de Newton-Raphson sans besoin de calculer la dérivée. Convergence super-linéaire (≈ 1,618) mais moins rapide que Newton (quadratique). Utile si la dérivation est difficile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bibliothèques tierces&lt;/strong&gt; : &lt;code&gt;finance.js&lt;/code&gt; ou &lt;code&gt;formulajs&lt;/code&gt; en JavaScript intègrent directement des fonctions RATE() équivalentes à Excel. Masquent les subtilités mais peuvent être moins performantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance comparée
&lt;/h2&gt;

&lt;p&gt;Benchmark sur Chrome 2026, 1000 appels consécutifs avec des jeux de paramètres variés :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode&lt;/th&gt;
&lt;th&gt;Temps moyen (ms)&lt;/th&gt;
&lt;th&gt;Itérations moyennes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Newton-Raphson&lt;/td&gt;
&lt;td&gt;0,8&lt;/td&gt;
&lt;td&gt;5,3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Newton-Raphson + fallback&lt;/td&gt;
&lt;td&gt;1,2&lt;/td&gt;
&lt;td&gt;6,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dichotomie&lt;/td&gt;
&lt;td&gt;18,4&lt;/td&gt;
&lt;td&gt;47,2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sécante&lt;/td&gt;
&lt;td&gt;1,5&lt;/td&gt;
&lt;td&gt;7,8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Newton-Raphson pur est 20× plus rapide que la dichotomie. Différence significative pour une application qui recalcule en temps réel à chaque changement de paramètre d'un slider utilisateur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cas d'usage avancé : amortissement mensuel
&lt;/h2&gt;

&lt;p&gt;Une fois le TAEG calculé, on peut générer le tableau d'amortissement détaillé :&lt;br&gt;
&lt;/p&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;tableauAmortissement&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;r_mensuel&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tableau&lt;/span&gt; &lt;span class="o"&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;capital_restant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;capital&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;mois&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="nx"&gt;mois&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&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;mois&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;interets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;capital_restant&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;r_mensuel&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;principal&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;interets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;capital_restant&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;tableau&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;mois&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="na"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;principal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;interets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;interets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;capital_restant&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;max&lt;/span&gt;&lt;span class="p"&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;capital_restant&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&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;tableau&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce tableau permet de visualiser l'évolution des intérêts décroissants et du principal croissant sur la durée du prêt. Utile pour afficher un graphique en secteurs (pie chart) ou en lignes qui montre concrètement comment la banque gagne plus en début de prêt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intégration dans un simulateur web complet
&lt;/h2&gt;

&lt;p&gt;Le simulateur web complet doit intégrer :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Saisie utilisateur&lt;/strong&gt; : revenus, apport, charges existantes, prix du bien, frais annexes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calcul de capacité&lt;/strong&gt; : via formule inverse + HCSF 35 %&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calcul du TAEG&lt;/strong&gt; : via Newton-Raphson avec fallback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tableau d'amortissement&lt;/strong&gt; : visualisation détaillée&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparaison scénarios&lt;/strong&gt; : durée 20/25/27 ans pour voir l'impact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation PTZ&lt;/strong&gt; : zones A/B1/B2/C 2026 avec conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests HCSF&lt;/strong&gt; : vert/orange/rouge pour le profil analysé&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vérification usure&lt;/strong&gt; : comparaison au taux d'usure trimestriel&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bonne pratique : séparer calcul et affichage
&lt;/h2&gt;

&lt;p&gt;Architecture recommandée :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Couche domaine&lt;/strong&gt; (pure math) : fonctions sans dépendance UI, testables unitairement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Couche state management&lt;/strong&gt; : gère les inputs utilisateur et recalcule à chaque changement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Couche présentation&lt;/strong&gt; : affichage formaté, graphiques, responsive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette séparation permet de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tester les formules en isolation (unit tests rigoureux)&lt;/li&gt;
&lt;li&gt;Réutiliser la logique dans différents frameworks (React, Vue, Svelte)&lt;/li&gt;
&lt;li&gt;Faciliter les audits réglementaires par les équipes compliance bancaires&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pour aller plus loin
&lt;/h2&gt;

&lt;p&gt;Le HCSF publie trimestriellement les taux d'usure et la Banque de France les taux moyens constatés. L'intégration de ces données via API publique permet de maintenir le simulateur à jour automatiquement.&lt;/p&gt;

&lt;p&gt;Pour creuser l'implémentation complète avec la méthode de capacité d'emprunt inverse, les tests HCSF 35 %, les zones PTZ 2026 et le tableau d'amortissement détaillé — &lt;a href="https://macalculatriceenligne.com/finance/immobilier/pret-calcul/" rel="noopener noreferrer"&gt;simulateur complet avec code source ouvert&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Références : HCSF décisions 2022-2026, Banque de France bulletin trimestriel taux d'usure T1 2026, Code de la consommation article L314-4, directive européenne 2014/17/UE sur le crédit immobilier, spécifications OFEC Formule TAEG équivalent.&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>
