Maison > Questions et réponses > le corps du texte
P粉2758839732023-08-09 10:40:33
31.005 est en fait entre les deux nombres, vérifiez la précision en virgule flottante sur https://php.net/float.
> ini_set('precision', 23) = "14" > 31.005 = 31.00499999999999900524
(En PHP et dans d'autres langages, il n'y a pas de numéro 31.005..)
Vous devez fournir des chiffres avec une précision suffisante, mais avec le moins d'erreurs possible, pour répondre à vos exigences d'affichage. Ceci peut être réalisé en spécifiant le mode d'arrondi, par exemple, si vous souhaitez arrondir 31,005 à 31,01, vous pouvez choisir d'arrondir vers le haut ou vers le bas.
$formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
$formatter->setAttribute(
NumberFormatter::ROUNDING_MODE,
NumberFormatter::ROUND_HALFUP
);
echo $formatter->formatCurrency(31.005, 'USD'), "\n";
# Output: .01
C'est le sujet de l'avis de Droopsnoot
Comme Olivier l'a rappelé dans les commentaires, le mode par défaut est l'arrondi semi-pair, également appelé arrondi du banquier.
De plus, ils ont souligné qu'il serait "plus formel" d'utiliser la constante de classe NumberFormatter::CURRENCY au lieu d'utiliser le nombre magique 2
$formatter = new NumberFormatter('en', 2);
$formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
Cela permettra à votre code de mieux communiquer, sinon le chiffre 2 pourrait être interprété comme un nombre de chiffres ou une précision, mais ce n'est pas le cas dans ce cas. Vous pouvez trouver toutes les constantes de style dans le manuel PHP.
Remarque : Il ne s'agit pas uniquement d'un problème spécifique à PHP, vous rencontrerez le même problème lorsque vous transmettrez ces nombres à Javascript et devrez les formater en Javascript.