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);

$tempt2 = doubleval($text);
$tempt = ($tempt2 +0.5);
$tempu = round($tempt, 0);

echo $tempu; echo "*";
}
else
{
echo "Error - file temperature.dat has no permission to read!";
}
}
?>
Kijk is naar de functie number_format

[size=xsmall]Toevoeging op 18/06/2012 13:56:23:[/size]


$tempu = round(number_format($tempt,"0"),0)


Probeer dit is.
Hans, kijk eens op php.net naar de functie round()

Die houdt al rekening met het afronden naar boven, vanaf .5 ...

<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
?>
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.

Probeer is floor() met tempratuur 20.3 wordt hij dan wel 20?
Probeer anders eens:

<?php
$tempu = round($tempt, 0, PHP_ROUND_HALF_UP);
?>
@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.
Trouwens, de rest van de code kan ook korter.

Deze code doet precies wat ik denk dat je nodig hebt.

<?php
if (isset($_GET['temp'])) {
// write temperature to file
file_put_contents(
"temperature.dat",
(float) $_GET['temp']
);
}
else {
// read temperature from file
$tempt = (float) file_get_contents("temperature.dat");
$tempu = round($tempt, 0, PHP_ROUND_HALF_UP);
echo $tempu;
}
?>
@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.??
Ja, dat laatste is het. en volgens mij moet Bert zijn oplossing de oplossing daarvoor zijn.
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.

Reageren