2016-07-19 13 views
1

Ich habe einige Arrays, die Zahlen für eine Multiplikation Quiz halten. Hier sind einige Beispiele:Falsche Berechnung mit Dezimalstellen in PHP

if($level==8){ 
     $first=array(13,14,16,17,18,19); 
     $second=array(9,10,11,12,13,14,15,16,17,18,19);} 
     if($level==9){ 
     $first=array(23,19,46,87,98,39); 
     $second=array(19,10,111,112,139,178,145,166,167,185,192);} 
     if($level>9){ 
     $first=array(2.3,1.9,4.6,8.7,9.8,3.9); 
     $second=array(1.9,10,11.1,11.2,13.9,17.8,14.5,16.6,16.7,18.5,19.2);} 

Diese Zahlen verwendet werden, einige Antworten zu berechnen, die auf Knopfdruck gesetzt werden und der Benutzer muss auf die richtige Antwort klicken.

// the correct answer 
     $b=rand(0,5); 
     $c=rand(0,10); 
     $f=$first[$b]; 
     $s=$second[$c]; 
     $d=$f*$s; 
    // wrong answer no. 1 
     $w1a=rand(0,5); 
     $w1b=rand(0,10); 
     $w1c=$first[$w1a]; 
     $w1d=$second[$w1b]; 
     $w1e=$w1c*$w1d; 
     if ($w1e==$d){ 
      wronganswer1(); 
     } 
    // wrong answer no. 2 
    $w2a=rand(0,5); 
     $w2b=rand(0,10); 
     $w2c=$first[$w2a]; 
     $w2d=$second[$w2b]; 
     $w2e=$w2c*$w2d; 
     if ($w2e==$d){ 
      wronganswer2(); 
     } 

Es ist eine Prüfung auf der Empfangsseite der Entsenderichtlinie, um zu sehen, ob der Benutzer tatsächlich die richtige Antwort bekommen hat:

$b=$_POST["b"]; 
$c=$_POST["c"]; 
$subby=$_POST["sub"]; 
$d=$c * $b; 
$score=$_SESSION["score"]; 
?> 
</head> 
     <body> 
    <?php 

    if ($subby==$d){ 

    echo "<script>correct.play()</script>";} 
    else{ 
     echo "<script>wrong.play()</script>"; 
     } 

    ?> 

    <?php 

if ($subby==$d) { 
    echo "Well done!"; 
    $_SESSION["score"]=$_SESSION["score"]+1; 
    echo "<h3>The button you pressed said: ".$subby; 
    echo "</h3><br><h2>"; 
    echo $b."x".$c."=".$subby; 
    echo "</h2><br>"; 
    echo "<h3>Your streak is worth ".$_SESSION["score"]; 

} 
else { 
    echo "<h1>No!<br>"; 
    $_SESSION["score"]=0; 
    echo $b."x".$c."=".$d; 
    echo "<br>"; 
    echo "Your streak has been reset to 0!</h1>"; 
} 

Nun, wenn ich ganze Zahlen habe: kein Problem. Aber die Dezimalstellen verursachen ein Problem. Mein Code sagt dem Spieler, dass eine korrekte Berechnung falsch ist!

Ich habe einige Zeit Echo aus einfachen dezimal Multiplikationen ausgegeben und die Ausgabe korrekt ist (also keine Abschneide der Dezimalstellen oder ähnliches) ...

Warum die Ungenauigkeit?

+0

Sind die Antworten mit '.' oder', 'von Benutzern? – JustOnUnderMillions

+0

Hallo @JustOnUnderMillions - Benutzer geben nichts ein, die Antwort wird ihnen auf der Schaltfläche präsentiert. – stilts77

Antwort

1

Ich vermute, dass Sie Fließkommazahlen auf die gleiche Weise wie Ganzzahlen vergleichen.

Es kann unmöglich wegen der Natur der Fließkommazahlen arbeiten.

Sie können die Gleichheit der Gleitkommawerte nicht überprüfen, aber Sie können fragen, ob ihre absolute Differenz innerhalb einer von Ihnen angegebenen Toleranz liegt. Hier ist Pseudo-Code zu zeigen, was ich meine:

float x = 1.1; 
float y = 1.2; 
float tolerance = 1.0e-3; 
if (abs(x-y) <= tolerance) { // abs() is an absolute value function 
    print "within tolerance" 
} else { 
    print "not within tolerance" 
} 
+0

Dank @duffymo hast du mich zum gewünschten Ergebnis geführt (siehe meine Antwort oben). Ich schätze den Code, den du erstellt hast - etwas, das ich für andere Projekte nutzen kann. – stilts77

+0

Ich würde es vorziehen, dass Sie abstimmen und die Antwort akzeptieren. – duffymo

0

Am Ende gelang es mir, das gewünschte Ergebnis zu erhalten durch Gießen meiner ‚Vergleichsperson‘ auf einen String (siehe oben Codezeile):

if ($subby==(string)$d) { 
    echo "Well done!"; 
    $_SESSION["score"]=$_SESSION["score"]+1; 
    echo "<h3>The button you pressed said: ".$subby; 
    echo "</h3><br><h2>"; 
    echo $b."x".$c."=".$subby; 
    echo "</h2><br>"; 
    echo "<h3>Your streak is worth ".$_SESSION["score"]; 

Danke für die Hilfe von allen, die mich zu der Erkenntnis geführt haben, dass man "fließende Werte nicht vergleichen kann".