Arrondir un prix en Smarty dans PrestaShop : ceil, round et 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.
En bref : Pour arrondir un prix au centime supérieur en Smarty, utilisez {math equation='ceil(a*100)/100' 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.
Le problème : afficher un prix HT arrondi correctement en Smarty
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.
Prenons un cas concret : un produit à 5,44 € TTC. En divisant par 1,2, Smarty affiche 4.5333333333333 € HT. Ce n'est évidemment pas présentable pour le client.
La question est alors : comment arrondir proprement ce montant, et surtout, comment obtenir un arrondi au centime supérieur plutôt qu'un arrondi classique ?
Les modificateurs d'arrondi disponibles en Smarty
Le modificateur `round` : arrondi mathématique standard
Smarty expose le modificateur round qui correspond à la fonction PHP round(). Il arrondit au plus proche :
{$total_without_taxes|round:2}
Avec une valeur de 4.5333, le résultat sera 4.53 — arrondi au centime le plus proche, vers le bas dans ce cas.
Le modificateur `ceil` : arrondi à l'entier supérieur
Le modificateur ceil arrondit à l'entier supérieur :
{$total_without_taxes|ceil}
Avec 4.5333, le résultat sera 5 — ce qui n'est pas non plus ce qu'on veut pour un prix au centime près.
Le modificateur `floor` : arrondi à l'entier inférieur
Pour mémoire, floor fait l'inverse de ceil :
{$total_without_taxes|floor}
Avec 4.5333, le résultat sera 4.
La solution : combiner `{math}` et `ceil` pour arrondir au centime supérieur
Aucun modificateur Smarty natif ne permet directement d'arrondir au centime supérieur. L'astuce consiste à utiliser la fonction {math} avec ceil() dans l'équation :
{math equation='ceil(a/1.2*100)/100' a=$prices.$ipa assign='total_without_taxes'}
<strong>{$total_without_taxes} € HT</strong>
Décortiquons cette formule
Le principe est simple : on multiplie par 100 pour décaler les centimes en position entière, on applique ceil() 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.
Variantes utiles
Arrondi au centime inférieur (floor)
{math equation='floor(a/1.2*100)/100' a=$prices.$ipa assign='total_without_taxes'}
Résultat : 4.53 au lieu de 4.54.
Arrondi classique au centime (round)
{math equation='round(a/1.2*100)/100' a=$prices.$ipa assign='total_without_taxes'}
Équivalent à round avec 2 décimales, mais intégré directement dans le calcul.
Forcer l'affichage de 2 décimales avec `string_format`
Un piège courant : si le résultat est 4.50, Smarty affichera 4.5. Pour garantir deux décimales :
{$total_without_taxes|string_format:'%.2f'} € HT
Cela affichera toujours 4.50 € HT au lieu de 4.5 € HT.
Bonne pratique PrestaShop 8.x : éviter les calculs de taxe dans les templates
Si cette technique fonctionne parfaitement, il faut souligner qu'en PrestaShop 8.x, le calcul de prix devrait idéalement se faire côté PHP, pas dans le template Smarty.
PrestaShop fournit la classe Tools avec des méthodes dédiées :
// Dans un module ou un override de controller
$priceWithoutTax = Tools::ps_round($priceTTC / 1.2, 2, PS_ROUND_UP);
Les constantes d'arrondi disponibles dans PrestaShop :
Puis on passe la variable au template via $this->context->smarty->assign(). Cette approche est plus maintenable, testable, et respecte la séparation des responsabilités.
Attention aux règles fiscales
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/TTC est encadrée. PrestaShop gère cela automatiquement via le paramètre Méthode d'arrondi dans Préférences > Général. Si vous calculez manuellement des prix HT dans vos templates, assurez-vous de respecter la méthode d'arrondi configurée dans votre boutique.
Pour récupérer dynamiquement la méthode d'arrondi configurée :
$roundMode = (int) Configuration::get('PS_PRICE_ROUND_MODE');
Cela garantit la cohérence entre vos calculs personnalisés et le reste de la boutique.
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

Alexandre Carette
Expert PrestaShop & Architecture E-commerce
Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.