Avatar billede danic Nybegynder
31. marts 2004 - 16:47 Der er 12 kommentarer og
3 løsninger

Beregning med decimaler i PHP

Jeg har lavet en select form hvor man kan rate fra 1-5

1) Jeg bruger en Mysql database til at gemme data, jeg har oprettet et rate felt (rate 1-5) og et polls felt(antal stemmer) hvilken felt type skal jeg vælge for at håntere decimaler?

Jeg har tænkt mig at udregne værdien når data gemmes, og runde op eller ned når data vises på skærmen.

Jeg har prøvet at lave begegningen, ved ikke om den er rigtig :)

Først henter jeg værdier
$all_polls = $rows['pools'];
$rate_now = $rows['rate'];

$rate_now / $all_polls * $all_polls = $onepoll
$onepoll *  $all_polls + $onepoll / $all_polls +1  = $rate_new

Havd gør jeg mht. til komatal og decimaler? og runde op og ned?
Avatar billede leflings Nybegynder
31. marts 2004 - 16:57 #1
Jeg vil gå ud fra at du kan nøjes med et felt af typen DECIMAL

Jeg kan ikke lige se om din beregning er rigtig, da jeg er lidt i tvivl hvilke data de forskellige variabler indeholder, men det er vel bare et spørgsmål om at regne gennemsnittet ud (lægge stemmerne sammen, og dividere med antallet af stemmer)

Til at afrunde med har php nogle indbyggede funktioner, du har nok kun brug for round()
http://dk.php.net/round

Mvh
Flemming Madsen
Avatar billede danic Nybegynder
31. marts 2004 - 17:11 #2
Hvordan får jeg php til at regne det er ud?

<?php
$all_polls = 10;
$rate_now = 3;

$result_one_poll = "($rate_now // $all_polls) * $all_polls";
print "$result_one_poll";
$new_result = "(($result_one_poll *  $all_polls) + $onepoll9) // $all_polls +1";
print "$new_result";
?>
Avatar billede detox Nybegynder
31. marts 2004 - 17:32 #3
Hvis jeg var dig, vil jeg bare lægge hver enkelt vote til i dit rate felt og ligeledes lægge 1 til polls. Så du har 'rate ialt' + 'antal stemmer'. Så er det jo bare at dividere de to.
Avatar billede muddi Praktikant
31. marts 2004 - 17:43 #4
For overhovedet at beregne noget skal du fjerne " omkring dit regnestykke.

<?php
$all_polls = 10;
$rate_now = 3;

$result_one_poll = ($rate_now / $all_polls) * $all_polls;
print "$result_one_poll";
$new_result = (($result_one_poll *  $all_polls) + $onepoll9) / $all_polls +1;
print "$new_result";
?>

Koden udskriver resultatet 34!

Du skal i øvrigt være opmærksom på en stavefejl i din originale kode:

"Først henter jeg værdier
$all_polls = $rows['pools'];    <-- pools skal være polls
$rate_now = $rows['rate'];"
Avatar billede leflings Nybegynder
31. marts 2004 - 17:44 #5
Jeg vil foreslå dig at bygge det anderledes op end du har gjort nu.

Lav en tabel med følgende opbygning:

CREATE TABLE `rate` (
`id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`rate` INT( 1 ) NOT NULL ,
PRIMARY KEY ( `id` )
);

Når der så afgives en stemme, indsætter du en ny række:

mysql_query("INSERT INTO rate VALUES('','".$rate_afgivet."));

Når du vil beregne gennemsnittet af alle stemmerne kan det gøres således:

mysql_query("SELECT count(*) AS rate_count, SUM(rate) AS rate_sum");

Alt efter hvordan du håndterer outputtet fra mysql vil beregningen se nogenlunde således ud:

$rate_avg = $rate_sum / $rate_count;

Så kan du evt afrunde det således:

$rate_avg = round($rate_avg, 2);

Mvh
Flemming Madsen
Avatar billede muddi Praktikant
31. marts 2004 - 17:51 #6
Flemming >> Ville det ikke være smartere bare at bruge AVG() og ROUND() i SQL-sætningen... Det er en bedre løsning end at lade PHP gøre det.

mysql_query("SELECT ROUND(AVG(rate) AS rate_avg), 2) FROM tabel");

Så er resultatet leveret!

Læs mere her: http://www.mysql.com/doc/en/Mathematical_functions.html
Avatar billede danic Nybegynder
31. marts 2004 - 17:56 #7
Det er måske mest smart at bruge detox løsning, da jeg aligevel skal lave en decimal begegning til sidst som runder op eller ned.

Men hvordan laver man en php beregning som runder og og ned til et helt tal?
Avatar billede detox Nybegynder
31. marts 2004 - 18:07 #8
I php bruger du osse round(). Altså:

$res = round($rate/$polls);
Avatar billede detox Nybegynder
31. marts 2004 - 18:11 #9
Men naturligvis kan du osse lave det i forespørgslen:

SELECT ROUND(rate/polls) AS res FROM tabel
Avatar billede leflings Nybegynder
31. marts 2004 - 18:18 #10
Ja, Muddi har jo ganske ret. Jeg kunne bare ikke lige huske de funktioner der skulle bruges for at gøre det i mysql, og jeg var for doven til at kigge i min manual ;)

Hvis du stadig bruger mit eksempel, mht. opbygning af tabelle, kan du helt udelade feltet id fra tabelstrukturen, og udelukkendde have feltet rate.

God fornøjelse.
Avatar billede danic Nybegynder
31. marts 2004 - 18:19 #11
Jeg bruger php da jeg aligevel henter alle felter fra tabellen:

$rateresult = ($row[rate] / $row[polls])
$rateresult = round($rateresult, 2);
Jeg har nu lagt data i og får 2.86 som resultat
hvordan får jeg det rundet op til 3? således at jeg kan indsætte 3 små billeder til at vise resultatet.
Avatar billede detox Nybegynder
31. marts 2004 - 18:21 #12
$rateresult = round($row['rate']/$row['polls']);
Avatar billede danic Nybegynder
31. marts 2004 - 18:26 #13
detox> det må jeg sige det er simpelt :)

Tak til alle, Jeg lader den stå åbent lidt, så i kan når at komme med svar!
Avatar billede detox Nybegynder
31. marts 2004 - 18:30 #14
Ja, det er egentlig ret enkelt ;o)
Avatar billede leflings Nybegynder
31. marts 2004 - 18:35 #15
Tja, hvis du mener jeg skal have nogle, så...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester