4 votes

Un problème d'addition PHP très simple

Je pense que j'ai regardé ça trop longtemps. Pourquoi ce code affiche-t-il 'non' ? Il devrait afficher 'oui', n'est-ce pas ? J'ai essayé avec PHP 5.3 et PHP 5.2 et les deux affichent 'non'.

<?php

$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;

if(($var1 + $var2 + $var3) == $total)
{
    echo 'yes';
}
else
{
    echo 'no';
}

?>

6voto

MaxVT Points 5191

Voir Comparaison de nombres à virgule flottante .

Cela ne fonctionne pas car les nombres à virgule flottante ne sont pas représentés exactement. Une petite erreur d'arrondi suffit pour que l'opérateur d'égalité échoue.

2voto

Cray Points 1043

Comme tout le monde le dit, ne comparez pas directement les flotteurs. Faites juste un if (abs($float1-$float2)<0.0000001)

ou similaire

Dans votre cas

<?php

$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;

if (abs(($var1 + $var2 + $var3)-$total)<0.000001)
{
    echo 'yes';
}
else
{
    echo 'no';
}

?>

2voto

xdebug Points 183

Comme mentionné dans d'autres réponses, soyez prudent lorsque vous comparez des flotteurs. Essayez plutôt ceci :

echo ((int)(($var1+$var2+$var3)-$total)==0)?"yes":"no";

1voto

Treffynnon Points 13385

Une façon très paresseuse de contourner ce problème :

$var4 = $var1 + $var2 + $var3;
$var4 = number_format($var4, 2);
$total = number_format($total, 2);

if($var4 == $total)
{
    echo 'yes';
}
else
{
    echo 'no';
}

http://php.net/number_format

1voto

dnagirl Points 11581

Si vous avez souvent besoin de faire des calculs précis en virgule flottante, il est intéressant d'utiliser une bibliothèque telle que BPF o BCMath

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X