[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fj6gtjV7RBmuDsCUW25cINsDqK6msx7fCs07Ia2sVk9U":22,"megamenu":60,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":129,"$fTjYPi3BgAY0cV-QfVnxwAikZoXe-Ruf9pxyaNSXvH-c":197,"header-db":211,"footer-db":224},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":33,"psVersions":34,"content":38,"faq":39,"tldr":55,"readingTime":56,"generatedAt":57,"publishDate":57,"relatedArticles":58,"sourceCategory":59},"Arrondir un prix en Smarty dans PrestaShop : ceil, round et math","arrondir-prix-smarty-prestashop-ceil-round-math","Comment arrondir correctement un prix HT en Smarty dans PrestaShop : fonctions round, ceil, floor et l'astuce math equation pour un arrondi au centime supérieur.","developpement",[28,29,30,31,32],"smarty","arrondi","prix-ht","template","math","intermediaire",[35,36,37],"1.6","1.7","8.x","\u003Ch2>Le problème : afficher un prix HT arrondi correctement en Smarty\u003C\u002Fh2>\n\u003Cp>Lorsqu'on calcule un prix hors taxes directement dans un template Smarty — par exemple en divisant un prix TTC par 1,2 pour retrouver le montant HT — on obtient souvent un résultat avec de nombreuses décimales.\u003C\u002Fp>\n\u003Cp>Prenons un cas concret : un produit à 5,44 € TTC. En divisant par 1,2, Smarty affiche \u003Cstrong>4.5333333333333 € HT\u003C\u002Fstrong>. Ce n'est évidemment pas présentable pour le client.\u003C\u002Fp>\n\u003Cp>La question est alors : comment arrondir proprement ce montant, et surtout, comment obtenir un \u003Cstrong>arrondi au centime supérieur\u003C\u002Fstrong> plutôt qu'un arrondi classique ?\u003C\u002Fp>\n\u003Ch2>Les modificateurs d'arrondi disponibles en Smarty\u003C\u002Fh2>\n\u003Ch3>Le modificateur `round` : arrondi mathématique standard\u003C\u002Fh3>\n\u003Cp>Smarty expose le modificateur \u003Ccode>round\u003C\u002Fcode> qui correspond à la fonction PHP \u003Ccode>round()\u003C\u002Fcode>. Il arrondit au plus proche :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{$total_without_taxes|round:2}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Avec une valeur de 4.5333, le résultat sera \u003Cstrong>4.53\u003C\u002Fstrong> — arrondi au centime le plus proche, vers le bas dans ce cas.\u003C\u002Fp>\n\u003Ch3>Le modificateur `ceil` : arrondi à l'entier supérieur\u003C\u002Fh3>\n\u003Cp>Le modificateur \u003Ccode>ceil\u003C\u002Fcode> arrondit à l'\u003Cstrong>entier supérieur\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{$total_without_taxes|ceil}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Avec 4.5333, le résultat sera \u003Cstrong>5\u003C\u002Fstrong> — ce qui n'est pas non plus ce qu'on veut pour un prix au centime près.\u003C\u002Fp>\n\u003Ch3>Le modificateur `floor` : arrondi à l'entier inférieur\u003C\u002Fh3>\n\u003Cp>Pour mémoire, \u003Ccode>floor\u003C\u002Fcode> fait l'inverse de \u003Ccode>ceil\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{$total_without_taxes|floor}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Avec 4.5333, le résultat sera \u003Cstrong>4\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Ch2>La solution : combiner `{math}` et `ceil` pour arrondir au centime supérieur\u003C\u002Fh2>\n\u003Cp>Aucun modificateur Smarty natif ne permet directement d'arrondir au \u003Cstrong>centime supérieur\u003C\u002Fstrong>. L'astuce consiste à utiliser la fonction \u003Ccode>{math}\u003C\u002Fcode> avec \u003Ccode>ceil()\u003C\u002Fcode> dans l'équation :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{math equation='ceil(a\u002F1.2*100)\u002F100' a=$prices.$ipa assign='total_without_taxes'}\n&lt;strong&gt;{$total_without_taxes} € HT&lt;\u002Fstrong&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Décortiquons cette formule\u003C\u002Fh3>\n\u003Ctr>\u003Cth>Étape\u003C\u002Fth>\u003Cth>Opération\u003C\u002Fth>\u003Cth>Résultat\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>1\u003C\u002Fth>\u003Cth>`a \u002F 1.2`\u003C\u002Fth>\u003Cth>4.5333...\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>2\u003C\u002Fth>\u003Cth>`× 100`\u003C\u002Fth>\u003Cth>453.33...\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>3\u003C\u002Fth>\u003Cth>`ceil(...)`\u003C\u002Fth>\u003Cth>454\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>4\u003C\u002Fth>\u003Cth>`\u002F 100`\u003C\u002Fth>\u003Cth>**4.54**\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>Le principe est simple : on multiplie par 100 pour décaler les centimes en position entière, on applique \u003Ccode>ceil()\u003C\u002Fcode> pour arrondir vers le haut, puis on divise par 100 pour remettre le nombre à l'échelle. C'est la même technique qu'on utiliserait en PHP pur.\u003C\u002Fp>\n\u003Ch2>Variantes utiles\u003C\u002Fh2>\n\u003Ch3>Arrondi au centime inférieur (floor)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{math equation='floor(a\u002F1.2*100)\u002F100' a=$prices.$ipa assign='total_without_taxes'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Résultat : \u003Cstrong>4.53\u003C\u002Fstrong> au lieu de 4.54.\u003C\u002Fp>\n\u003Ch3>Arrondi classique au centime (round)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{math equation='round(a\u002F1.2*100)\u002F100' a=$prices.$ipa assign='total_without_taxes'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Équivalent à \u003Ccode>round\u003C\u002Fcode> avec 2 décimales, mais intégré directement dans le calcul.\u003C\u002Fp>\n\u003Ch3>Forcer l'affichage de 2 décimales avec `string_format`\u003C\u002Fh3>\n\u003Cp>Un piège courant : si le résultat est 4.50, Smarty affichera \u003Cstrong>4.5\u003C\u002Fstrong>. Pour garantir deux décimales :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{$total_without_taxes|string_format:'%.2f'} € HT\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cela affichera toujours \u003Cstrong>4.50 € HT\u003C\u002Fstrong> au lieu de 4.5 € HT.\u003C\u002Fp>\n\u003Ch2>Bonne pratique PrestaShop 8.x : éviter les calculs de taxe dans les templates\u003C\u002Fh2>\n\u003Cp>Si cette technique fonctionne parfaitement, il faut souligner qu'en PrestaShop 8.x, \u003Cstrong>le calcul de prix devrait idéalement se faire côté PHP\u003C\u002Fstrong>, pas dans le template Smarty.\u003C\u002Fp>\n\u003Cp>PrestaShop fournit la classe \u003Ccode>Tools\u003C\u002Fcode> avec des méthodes dédiées :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Dans un module ou un override de controller\n$priceWithoutTax = Tools::ps_round($priceTTC \u002F 1.2, 2, PS_ROUND_UP);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Les constantes d'arrondi disponibles dans PrestaShop :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Constante\u003C\u002Fth>\u003Cth>Comportement\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`PS_ROUND_UP`\u003C\u002Fth>\u003Cth>Arrondi au centime supérieur\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`PS_ROUND_DOWN`\u003C\u002Fth>\u003Cth>Arrondi au centime inférieur\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`PS_ROUND_HALF_UP`\u003C\u002Fth>\u003Cth>Arrondi classique (0.5 → 1)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`PS_ROUND_HALF_DOWN`\u003C\u002Fth>\u003Cth>Arrondi classique (0.5 → 0)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`PS_ROUND_HALF_EVEN`\u003C\u002Fth>\u003Cth>Arrondi bancaire\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>Puis on passe la variable au template via \u003Ccode>$this->context->smarty->assign()\u003C\u002Fcode>. Cette approche est plus maintenable, testable, et respecte la séparation des responsabilités.\u003C\u002Fp>\n\u003Ch2>Attention aux règles fiscales\u003C\u002Fh2>\n\u003Cp>Le choix entre arrondi supérieur et inférieur n'est pas anodin sur le plan fiscal. En France, la règle d'arrondi des prix HT\u002FTTC est encadrée. PrestaShop gère cela automatiquement via le paramètre \u003Cstrong>Méthode d'arrondi\u003C\u002Fstrong> dans \u003Cstrong>Préférences > Général\u003C\u002Fstrong>. Si vous calculez manuellement des prix HT dans vos templates, assurez-vous de respecter la méthode d'arrondi configurée dans votre boutique.\u003C\u002Fp>\n\u003Cp>Pour récupérer dynamiquement la méthode d'arrondi configurée :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$roundMode = (int) Configuration::get('PS_PRICE_ROUND_MODE');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cela garantit la cohérence entre vos calculs personnalisés et le reste de la boutique.\u003C\u002Fp>",[40,43,46,49,52],{"q":41,"a":42},"Comment arrondir au centime supérieur en Smarty dans PrestaShop ?","Utilisez la fonction {math} avec ceil : {math equation='ceil(a*100)\u002F100' a=$votre_variable}. Le principe est de multiplier par 100 pour travailler sur les centimes en entier, appliquer ceil() pour arrondir vers le haut, puis diviser par 100.",{"q":44,"a":45},"Quelle est la différence entre round, ceil et floor en Smarty ?","round arrondit au plus proche (4.53 pour 4.533), ceil arrondit à l'entier supérieur (5 pour 4.533) et floor à l'entier inférieur (4 pour 4.533). Pour arrondir au centime (et non à l'entier), il faut combiner ces fonctions avec une multiplication\u002Fdivision par 100 via {math}.",{"q":47,"a":48},"Comment afficher un prix avec exactement 2 décimales en Smarty ?","Utilisez le modificateur string_format : {$prix|string_format:'%.2f'}. Sans cela, Smarty peut afficher 4.5 au lieu de 4.50, ce qui n'est pas professionnel pour un affichage de prix.",{"q":50,"a":51},"Faut-il calculer les prix HT directement dans les templates Smarty ?","Non, c'est une pratique déconseillée. En PrestaShop 8.x, privilégiez le calcul côté PHP avec Tools::ps_round() et les constantes PS_ROUND_UP\u002FPS_ROUND_DOWN, puis passez le résultat au template via smarty->assign(). Cela respecte la séparation des responsabilités et la méthode d'arrondi configurée en back-office.",{"q":53,"a":54},"Comment respecter la méthode d'arrondi configurée dans PrestaShop ?","PrestaShop stocke la méthode d'arrondi dans Configuration::get('PS_PRICE_ROUND_MODE'). Quand vous faites des calculs de prix personnalisés, utilisez Tools::ps_round($prix, 2) qui applique automatiquement la méthode configurée, plutôt qu'un arrondi arbitraire dans Smarty.","Pour arrondir un prix au centime supérieur en Smarty, utilisez {math equation='ceil(a*100)\u002F100' a=$variable}. En PrestaShop 8.x, préférez Tools::ps_round() côté PHP avec la constante PS_ROUND_UP pour respecter les règles d'arrondi de la boutique.",4,"2026-03-21T16:25:45.000Z",[],"PrestaShop pour les développeurs",{"items":61},[62,73,81,89,97,105,113,121],{"id":63,"type":64,"label":65,"href":67,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":70,"children":71,"psChildren":72},41,"link",{"fr":66},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":74,"type":64,"label":75,"href":77,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":78,"children":79,"psChildren":80},42,{"fr":76},"Blog","\u002Fblog",1,[],[],{"id":82,"type":64,"label":83,"href":85,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":86,"children":87,"psChildren":88},43,{"fr":84},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":90,"type":64,"label":91,"href":93,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":94,"children":95,"psChildren":96},44,{"fr":92},"Outils IA","\u002Foutils-ia",3,[],[],{"id":98,"type":64,"label":99,"href":101,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":102,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":56,"children":103,"psChildren":104},45,{"fr":100},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},[],[],{"id":106,"type":64,"label":107,"href":109,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":110,"children":111,"psChildren":112},46,{"fr":108},"Academy","\u002Facademy",5,[],[],{"id":114,"type":64,"label":115,"href":117,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":118,"children":119,"psChildren":120},47,{"fr":116},"À propos","\u002Fa-propos",6,[],[],{"id":122,"type":64,"label":123,"href":125,"icon":68,"description":68,"badge":68,"groupTitle":68,"style":68,"gridColumns":68,"cssClass":68,"psCategoryId":68,"showPsChildren":69,"position":126,"children":127,"psChildren":128},48,{"fr":124},"Contact","\u002Fcontact",7,[],[],{"columns":130},[131,143,173,189],{"title":132,"links":133},"Plateforme",[134,136,139,140],{"label":135,"href":101,"external":69},"Offre Starter (2 500 €)",{"label":137,"href":138,"external":69},"Devenir Ambassadeur","\u002Fambassadeur",{"label":84,"href":85,"external":69},{"label":141,"href":142,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":144,"links":145},"Le Synedre",[146,149,152,155,158,161,164,167,170],{"label":147,"href":148,"external":69},"L'histoire","\u002Fsynedre",{"label":150,"href":151,"external":69},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":153,"href":154,"external":69},"L'équipe","\u002Fequipe",{"label":156,"href":157,"external":69},"Le réacteur en direct","\u002Freacteur",{"label":159,"href":160,"external":69},"Le Drill (entraînement)","\u002Fdrill",{"label":162,"href":163,"external":69},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":165,"href":166,"external":69},"Les agents IA","\u002Fagents-ia",{"label":168,"href":169,"external":69},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":171,"href":172,"external":69},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":174,"links":175},"Ressources",[176,177,178,181,183,186],{"label":76,"href":77,"external":69},{"label":108,"href":109,"external":69},{"label":179,"href":180,"external":69},"Dictionnaire","\u002Fdictionnaire",{"label":182,"href":67,"external":69},"Expertise PrestaShop",{"label":184,"href":185,"external":69},"Flywheel","\u002Fflywheel",{"label":187,"href":188,"external":69},"Manifeste","\u002Fmanifeste",{"title":116,"links":190},[191,193,196],{"label":192,"href":117,"external":69},"Alexandre Carette",{"label":194,"href":195,"external":69},"Dossier de presse","\u002Fpresse",{"label":124,"href":125,"external":69},{"academy":198,"blog":199,"expertise":210},[],[200,204,207],{"title":201,"url":202,"score":78,"type":203},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":205,"url":206,"score":78,"type":203},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":208,"url":209,"score":78,"type":203},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":212},{"logo":213,"topBar":218,"contactEmail":221,"features":222,"navBar":68},{"src":214,"alt":215,"text":192,"href":216,"class":217},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":68,"showLanguages":69,"align":219,"languages":220},"left",[],"contact@alexandrecarette.fr",{"showSearch":69,"showWishlist":69,"showLogin":20,"showContact":69,"showCart":69,"stickyHeader":20,"headerLayout":223},"inline",{"footer":225},{"theme":226,"description":68,"hours":68,"logo":227,"contact":228,"social":229,"bottomBar":239},"dark",{"src":214,"href":216,"alt":192},{"email":68,"phone":68,"address":68,"cta":68},[230,233,236],{"platform":231,"href":232,"label":231},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":234,"href":235,"label":234},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":237,"href":238,"label":237},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":68}]