4 votes

Multiplication erronée en PHP

J'essaie d'effectuer une simple opération sur deux nombres, mais l'opération renvoie un résultat erroné.

Les chiffres sont par exemple 46.29 y 10 . Le premier dans la $a et la seconde dans la variable $b variable.

Processus

echo $a * $b

retours 460

echo 10 * 46.29

imprimer le bon nombre (462.90)

$a * 10

y

46.29 * $b

Le résultat est toujours le même : 460 !

echo $a

imprimer 46,29

echo $b

imprimer 10

echo floatval($a) * floatval($b)

imprimer 460

echo intval($a)

imprimer 46

J'ai également essayé d'utiliser bcmul et dans ce cas, il imprimera 0.

Vous trouverez ici mon code :

include 'simple_html_dom.php';

     $anno = $_POST['Anno'];
     $punti = $_POST['Punti'];
     $eta = $_POST['Eta'];
     $ggAss = $_POST['GgAss'];
     $ggParz1 = $_POST['GgParz1'];
     $ggParz2 = $_POST['GgParz2'];
     $ggParz3 = $_POST['GgParz3'];
     $pctDM = $_POST['PctDM'];
     $calcoloDM = $_POST['CalcoloDannoMorale'];
     $speseMediche = $_POST['SpeseMediche'];
     $spese = $_POST['Spese'];

    $html = file_get_html('..\tabella'.$anno.'.php');

    $rows = $html->find('tr');

    // This variable is use to make sure that the correct number will be display. (there is a kind of offset in the output table).
    $const = 2;

    $i = 0;
    $cond = false;
    foreach ($rows as $row) {
        $j = 0;
        foreach ($row->children() as $cell) {
            if($cond)
                break;
            //This condition is used to get punto base e indennità giornaliera
            if($i == 1) {
                $var1 = explode(" ", $cell->plaintext);
                $indennitaGG = $var1[10]; // here we can get indennità giornaliera
            }
            if($i == ($eta + $const) && $j == $punti) {
                $dannoBP = $cell->plaintext;
                $cond = true;
                break;
            }
            $j++;
        }
        $i++;
    }

    $calcIndGG = $indennitaGG * $ggAss;
    $newVar = $indennittaGG;
    echo 46.29 * 10;
    $calcIndParz1 = ($indennitaGG * 75 / 100) * $ggParz1;
    $calcIndParz2 = ($indennitaGG * 50 / 100) * $ggParz2;
    $calcIndParz3 = ($indennitaGG * 25 / 100) * $ggParz3;
    $dm = ($calcIndGG + $calcIndParz1 + $calcIndParz2 + $calcIndParz3) * $pctDM / 100;

    $totale = $dannoBP + $calcIndGG + $calcIndParz1 + $calcIndParz2 + $calcIndParz3 + $dm + $speseMediche + $spese;

Quel est le problème ?

EDIT : PROBLÈME RÉSOLU avec ce code :

//This change is used to transform the variable $indennitaGG in the right form. (with the . and not with the ,). Then we can make the cast to float.

    $temp = str_replace(",",".", $indennitaGG);
        $indennitaGG = (float)$temp;

4voto

ForceMagic Points 386

Les , n'est pas valide pour un nombre à virgule flottante. Essayez de le remplacer par str_replace(",",".",$a); . Essayez même de le faire avec les deux numéros si vous le souhaitez.

Le séparateur décimal "officiel" (pour PHP) est un point ( . ), c'est pourquoi la multiplication échoue. Dans votre langue, il peut s'agir d'une virgule, mais PHP utilise un point.

C'est ce que PHP dirait (à floatval($a) ) :

Ok, j'ai obtenu deux caractères, ce qui est un nombre valide ( 46 ), mais après il y a un symbole bizarre, je vais juste lancer un avertissement, ajouter un point décimal et un zéro (parce que je n'ai pas trouvé d'autres points décimaux), et et terminer la conversion ici.

Si vous utilisez ce code, cela devrait fonctionner :

str_replace(",",".",$a);
str_replace(",",".",$b);
echo floatval($a) * floatval($b);

Explication :

Comme je l'ai dit, vous utilisez un décimale virgule qui n'est pas valide. Ce que str_replace(original, replacement, subject) est de trouver toutes les occurrences de original dans une chaîne (ici : sujet ) et le remplace par le remplacement valeur. Il en résulte le remplacement de décimal virgule avec un point décimal .

Ejemplo: 40,3 devient 40.3

Il en résulte toujours une Chaîne qui n'est évidemment pas un nombre. Pour le convertir, nous utilisons la méthode floatval(string) , ce qui se traduit par une Flotteur qui est l'abréviation de Floating-point number (nombre à virgule flottante) et ensuite, nous pouvons effectuer des opérations arithmétiques.

3voto

Al Bundy Points 2017

Su locale est l'utilisation d'un signe différent pour la virgule. Je soupçonne que lorsque vous lisez les nombres à partir d'un fichier, ils sont dans le "mauvais" format - par ex. 46,29 et non 46.29 comme je peux le voir dans le echo .

Remplacer le , a . et le problème est résolu.

0voto

Goose Points 2630

Si vous exécutez ce code, vous obtiendrez le bon résultat.

$a = 10;
$b = 46.29;
echo $a * $b;

echo $a et $b avant de passer aux calculs. Si les nombres sont corrects, lancez-les comme ceci.

echo floatval($a) * floatval($b) ;

Si cela ne fonctionne pas, vous devrez nous fournir le bon code pour recréer le problème. Votre code complet dépend de variables post et d'un include. Donnez-nous juste le code pour recréer le problème.

0voto

Kami Yang Points 305

Essayez de les lancer comme un flotteur avant de les utiliser. Cela devrait fonctionner. Si ce n'est pas le cas, quels types d'objets obtenez-vous lorsque vous utilisez _var_dump()_ ?

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