2017-04-25 4 views
2

suis récemment tombé sur une situation où je travaillais sur un serveur qui avait un fichier php.ini avec:Pourquoi le paramètre 'precision' brise-t-il php round()?

precision = 16 

La valeur par défaut étant 14, cela semble assez inoffensif. Malheureusement, il conduit à ceci:

// ini_set('precision', 16); 
echo round((20.12/36.79),4); 

Résultat:0.5469000000000001

Huh? Ne devrait pas prendre soin des problèmes de précision de virgule flottante ici?

+0

err, ce ..? peut mentionner la version de php? –

+0

Cela ne semble pas avoir d'importance car c'est un problème de précision flottant. Testé et même résultat php 5.3 - php 7.0 – billynoah

+1

ah je vois, on dirait que nous avons raté le concept de tronquer vs arrondi .. bien [une discussion sur les points flottants] (http://stackoverflow.com/a/14656315/4648586) –

Répondre

1

La fonction round() de php renvoie toujours un nombre à virgule flottante, et non une chaîne, ce qui peut être inexact.

0.5469 est présenté comme suit 8 octets 0x3FE180346DC5D639 codé double précision IEEE754.

Ce qui est pas la représentation exacte de 0.5469, mais un nombre le plus proche representible, qui est en fait 5.46900000000000052757798130187E-1

Références: