Via onderstaand scriptje haal ik de temperatuur van een thermometer binnen. Nu wil ik dit getal met een cijfer achter de comma rekenkundig goed afronden. Ik ben al op verschillende wijzen bezig geweest, maar eindigend op .5 naar boven en .4 naar beneden afronden blijft fout gaan.
Wat doe ik mis, wie weet raad??
Bedankt alvast.
Hans
<?php
//ini_set("display_errors", 1);
// Load variables from the temp sensor and protected against XSS attacks.
$TEMP = htmlspecialchars($_GET['temp'], ENT_QUOTES, "UTF-8");
// If the temperature comes as a parameter, write it in a file and displays the results.
// If the file has the appropriate rights, displays an error message.
if ($TEMP)
{
if ($file=@fopen("temperature.dat", "w"))
{
$text=fwrite($file,$TEMP);
fclose($file);
echo $TEMP;
}
else
{
echo "Error - file temperature.dat does not have permission to write!";
}
}
// If the temperature does not come as a parameter, loads and displays the temperature of teploty.dat file.
// If the file has the appropriate rights, displays an error message.
if (!$TEMP)
{
if ($file=@fopen("temperature.dat", "r"))
{
$text=fread($file,10);
fclose($file);
Dank voor jullie snelle reactie.
@Bert. Ik heb het geprobeerd. Op dit moment is de temperatuur die ingelezen wordt 20,3 en hij rond op jouw wijze af naar... 21. Helaas dat os dus niet de oplossing
@Kris. Uiteraard heb ik dit uitgebreid bestudeerd. Maar omdat ik steeds een onjuiste afrondig krijg, ga je toch twijfelen. Ik heb de optelling weggelaten of op 0 gesteld, zelfs een optelling met 0,3 en 0,4 gedaan om te kijken waar het omslagpunt ligt. Dat heb ik dus niet kunnen vaststellen.
?
Onbekende gebruiker
18-06-2012 14:59
Probeer is floor() met tempratuur 20.3 wordt hij dan wel 20?
@Bert. floor($tempt) leek te werken. Bij 20,3 gaf hij keurig 20. Net werd het 19,9 en gaf hij nog steeds 20. Inmiddels is het 19,6 en dat rond hij af met het commando floor op 19 Jammer.
@Koen. Bedankt voor het meedenken. Round Half Up had ik ook al geprobeerd maar werkte ook niet correct. Het lijkt steeds eerst te werken maar bij veranderingen gaat het dan toch weer mis.
@Kris. Je kortere code erin gezet en geeft op dit moment de juiste waarde aan. Het is 20,4 en hij laat zien 20. Afwachten wat er straks gaat gebeuren.
Je verneemt later!
[size=xsmall]Toevoeging op 18/06/2012 16:38:24:[/size]
@Kris. Helaas, het is nu 19,6 en hij geeft 19 aan.
[size=xsmall]Toevoeging op 19/06/2012 11:21:13:[/size]
Ik denk de oorzaak gevonden te hebben. Nog geen oplossing!
Als ik per regel een echo opdracht geeft blijk dat $text bijvoorbeeld de waarde 18,6 heeft. Ter afronding wordt er 0,5 bij opgeteld maar dat gaat niet goed. In dit voorbeeld wordt dit 18,5. Hij hakt dus af op 18 en telt er 0,5 bij op. Ook bij andere waarden is dat zo.
Hoe kan ik zorgen dat deze optelling goed gaat?
[size=xsmall]Toevoeging op 19/06/2012 13:15:25:[/size]
@Kris. Als ik de waarde van $temp echo hoef ik al niet meer af te ronden. Dit getal is bij de komma al afgekapt.
[size=xsmall]Toevoeging op 19/06/2012 13:17:15:[/size]
ik bedoel $tempt (in regel 11)
[size=xsmall]Toevoeging op 19/06/2012 14:39:57:[/size]
zou het niet kunnen zijn dat de string die ik binnenhaal bestaat uit getallen met een komma. Dit moet eerst omgezet worden in een getal met een punt lijkt me, waarna je pas ermee kan rekenen en dus afronden e.d.??
Alleen de regel van Bert werkt niet correct. Ik heb wat aan zitten passen om te kijken wat er gebeurd:
echo "text_:"; echo $text;
$tempt2 = number_format($text,"1"); echo "_tempt2_"; echo $tempt2;
$tempt = ($tempt2 +0.5); echo "_tempt_"; echo $tempt;
$tempu = round($tempt,0); echo $tempu; echo "*";
resultaat: text_:21,1 _tempt2_21.0 _tempt_21.5 22*
Je ziet bij text_: de ingelezen temperatuur van 21,1 waar gelijk 21.0 van gemaakt wordt. Hier gaat het dus al fout.