Rundung in query bei PHP+MySQL

Rundung in query bei PHP+MySQL

am 27.10.2005 17:35:34 von Mahmut Kursun

Hallo,

ich habe PHP Version 4.2.2 und MySQL 3.23.52-Max. Bei einer Rechnung die
ich innerhalb von einer query mache habe ich das Problem dass eine
Variable die ich innnerhalb der Select-Anweisung mache der Wert
auf zwei Stellen nach dem Komma gerundet wird.

Hier ist der relevante code aus der PHP Datei:

while ($myrow = mysql_fetch_row($_result)) {

$result2 = mysql_query("select ID, Titel, sum(Note_1), sum(Note_2),
sum(Note_3), sum(Note_4), sum(Note_5), sum(Note_6),
((sum(Note_1)+(sum(Note_2)*2)+(sum(Note_3)*3)+(sum(Note_4)*4 )+
(sum(Note_5)*5)+(sum(Note_6)*6))/(sum(Note_1)+sum(Note_2)+su m(Note_3)+
sum(Note_4)+sum(Note_5)+sum(Note_6))) as Note from " . $Projektkuerzel .
"_stimmen group by Titel order by Note asc",$db)

....

Dokumentierung:
Für jede Zeile in der Tabelle $Projektkuerzel_stimmen ziehe ich die
Werte "ID, Titel, Summe abgegebene Stimmen für Note 1, 2, 3, 4, 5, 6 und
einen Wert den ich als "Note" Bezeichne, welcher die Berechnung der
Durchschnittsnote für die jeweilige Zeile darstellt.

Wenn jetzt die Abstimmung so läuft:
Note 1: 2x
Note 2: 10x
Note 3: 12x
Note 4: 6x
Note 5: 2x
Note 6: 1x

wird der Notendurchschnitt errechnet und dann in dem Wert "Note" gespeichert
....
((sum(Note_1)+(sum(Note_2)*2)+(sum(Note_3)*3)+(sum(Note_4)*4 )+(sum(Note_5)*5)+
(sum(Note_6)*6))/(sum(Note_1)+sum(Note_2)+sum(Note_3)+sum(No te_4)+sum(Note_5)+
sum(Note_6))) as Note
....

(2 + 10*2 + 12*3 + 6*4 + 2*5 + 1*6) / (2+10+12+6+2+1)
= 98 / 33
= 2,969696


Wenn ich das mit PHP darstellen will (vereinfacht)

printf("
%f
\n", $myrow[8]);
} // end while


kommt die HTML Ausgabe:
2.970000



Wie kriege ich den Wert "Note" den ich in der mysql_query errechne
hin, dass er nicht nach der zweiten Kommastelle rundet?

Viele Grüsse

Re: Rundung in query bei PHP+MySQL

am 28.10.2005 20:50:31 von Johannes Vogel

Hi Mahmut

Mahmut Kursun wrote:
> ich habe PHP Version 4.2.2 und MySQL 3.23.52-Max. Bei einer Rechnung die
> ich innerhalb von einer query mache habe ich das Problem dass eine
> Variable die ich innnerhalb der Select-Anweisung mache der Wert
> auf zwei Stellen nach dem Komma gerundet wird.
> Hier ist der relevante code aus der PHP Datei:
> while ($myrow = mysql_fetch_row($_result)) {
> $result2 = mysql_query("select ID, Titel, sum(Note_1), sum(Note_2),
> sum(Note_3), sum(Note_4), sum(Note_5), sum(Note_6),
> ((sum(Note_1)+(sum(Note_2)*2)+(sum(Note_3)*3)+(sum(Note_4)*4 )+
> (sum(Note_5)*5)+(sum(Note_6)*6))/(sum(Note_1)+sum(Note_2)+su m(Note_3)+
> sum(Note_4)+sum(Note_5)+sum(Note_6))) as Note from " . $Projektkuerzel .
> "_stimmen group by Titel order by Note asc",$db)

Erstens bin ich mal mit deinem DB-Design nicht einverstanden. Das
Projektkürzel müsstest du mit grosser Wahrscheinlichkeit als Attribut in
die Tabelle 'Stimmen' miteinbeziehen. Normalisiere dein DB-Layout.

> (2 + 10*2 + 12*3 + 6*4 + 2*5 + 1*6) / (2+10+12+6+2+1)
> = 98 / 33
> = 2,969696
> Wenn ich das mit PHP darstellen will (vereinfacht)
> printf("
> %f
> \n", $myrow[8]);
> kommt die HTML Ausgabe:
> 2.970000
> Wie kriege ich den Wert "Note" den ich in der mysql_query errechne
> hin, dass er nicht nach der zweiten Kommastelle rundet?

Zweitens hast du noch drei Möglichkeiten, wo gerundet werden könnte:
a) in MySQL, b) in PHP und c) in printf. Grenze den Fehler ein und frage
in der jeweiligen Newsgroup nach.

Deine Berechnung ist falsch. Denn hast du mehr als einen Eintrag zu
summieren, musst du auch noch durch die Anzahl summierte Tupels
dividieren, um den Durchschnitt zu erhalten.

Welche Versionen der Programme verwendest du denn?
Welche Attributstypen verwendest du für die Noten?
Übrigens: Auch in MySQL gilt Punkt vor Strich, also kannst du viele
Klammern weglassen, was die Lesbarkeit erhöhen würde.

Ich hab mir mal etwas Zeit genommen:
create table test (a decimal(4,2), b decimal(4,2), c decimal(4,2));
insert into test values (3.25,4.1,5.5);
insert into test values (2.5,5.1,3.5);
insert into test values (3.25,4.1,5.5);
select (sum(a)*2+sum(b)*10+sum(c)*3)/(2+10+3)/count(*) from test;
ergibt: 4.322222
Das wird wohl auch an PHP zurückgegeben.

Also schau ich mal im Manual über printf nach:
http://php.benscom.com/manual/en/function.sprintf.php
"f - the argument is treated as a float, and presented as a
floating-point number (locale aware)."

"locale aware"?! Was das wohl bedeuten könnte? Versuch mal %F
stattdessen, welches "non-locale aware" dabei verzeichnet hat. Das
gibt's ab PHP 4.3.10 bzw. 5.0.3.

Ich glaube, hier ist das Problem zu suchen...
HTH, Johannes