web-dev-qa-db-fra.com

Comment obtenir une valeur flottante lors de la division de deux entiers? (PHP)

Salut, j'essaie de diviser deux entiers ex: 12/13 mais j'obtiens toujours un entier entier 1 pas un nombre décimal.

J'ai essayé de transcrire les valeurs en flottant avant la main sans succès.

Fondamentalement, tout ce que je veux, c'est un résultat décimal comme: 0,923 ...

$x = 12;
$y = 13;
echo $value = $x / $y; //Would like to see 0.923 not 1
21
user1869257

Dans des circonstances normales, votre code devrait retourner la valeur flottante 0.923076 ...

La raison pour laquelle vous obtenez un entier arrondi est peut-être parce que votre ini setting Pour "precision" Est réglé sur 0, Pour résoudre ce problème, modifiez votre php.ini Ou utilisez ini_set("precision", 3); dans votre code avant le calcul.

Une autre façon de contourner ce problème consiste à utiliser BCmath :

echo $value=bcdiv($a, $b, 3);

Et encore une autre façon sans utiliser d'extension est d'utiliser une petite astuce mathématique en multipliant la valeur que vous voulez diviser par 1000 Pour obtenir 3 decimals.
De cette façon, vous diviserez 12000 Par 13 Et la partie entière sera 923, Puis puisque vous multipliez par 1e3 insérez une virgule/point avant le dernier 3 places.

function divideFloat($a, $b, $precision=3) {
    $a*=pow(10, $precision);
    $result=(int)($a / $b);
    if (strlen($result)==$precision) return '0.' . $result;
    else return preg_replace('/(\d{' . $precision . '})$/', '.\1', $result);
}

echo divideFloat($a, $b); // 0.923

15
CSᵠ
echo $value = $x / (float) $y;

si vous transtypez la variable $y comme flottant, l'interpréteur utilise la division en virgule flottante au lieu de la division entière.

car il est supposé par défaut d'utiliser la division entière sur deux variables entières.

C'était différent si vous utilisiez $y = 13.0 (une variable flottante comme dénominateur): Le résultat est toujours un nombre flottant

13
Raffaello

Toutes les autres réponses ne sont pas correctes, car la division PHP retournera toujours des valeurs flottantes, comme cela est clairement indiqué dans le manuel officiel PHP: Opérateurs arithmétiques , sauf dans les cas où deux opérandes sont tous deux des entiers qui peuvent être divisés également.

En fait, la question est fausse: le code devrait produire 0,923 ..., comme prévu par l'interrogateur.

De manière sarcastique, la réponse votée (provenant de @ BulletProof47) est la seule autre qui n'est PAS FAUX (mais aussi vide de sens). Qui sait ce qu'il pensait, mais je parie que tout le monde sait pourquoi il a été rejeté: D

Dans le cas qui est intéressé, la fonction sous-jacente qui fait la division en php est div_function, situé dans Zend/zend_operators.c, indiqué ci-dessous:

ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
{
    zval op1_copy, op2_copy;
    int converted = 0;

    while (1) {
        switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
            case TYPE_PAIR(IS_LONG, IS_LONG):
                if (Z_LVAL_P(op2) == 0) {
                    zend_error(E_WARNING, "Division by zero");
                    ZVAL_BOOL(result, 0);
                    return FAILURE;         /* division by zero */
                } else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == LONG_MIN) {
                    /* Prevent overflow error/crash */
                    ZVAL_DOUBLE(result, (double) LONG_MIN / -1);
                    return SUCCESS;
                }
                if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
                    ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
                } else {
                    ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
                }
                return SUCCESS;
    ...
3
felix021