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);
Het probleem ligt dus niet bij het afronden; het probleem verschuift nu naar:
Hoe zorg je er voor dat de gegevens in "temperature.dat" juist geformatteerd zijn?
Van waar komen de gegevens?
Wie of wat vult die file "temperature.dat"?
(Ik ga even uit van mijn stuk code)
Nu is het zo dat je die file een nieuwe waarde geeft bv. door naar index.php?temp=21.6 te surfen.
Als de gebruiker echter naar index.php?temp=21,6 surft, wordt die ,6 gestript. Eventueel kunnen we hier een string replace doen, zodat een komma wordt omgezet naar een punt.
Zoiets:
<?php
if (isset($_GET['temp'])) {
// write temperature to file
$temperature = str_replace(",", ".", $_GET['temp']);
file_put_contents(
"temperature.dat",
(float) $temperature
);
}
else {
// read temperature from file
$tempt = (float) file_get_contents("temperature.dat");
$tempu = round($tempt, 0, PHP_ROUND_HALF_UP);
echo $tempu;
}
?>
Kris, Terwijl je reageert was ik ook bezig. Ik had dit dus ook gezien. Nu heb ik het volgende staan en dat lijkt goed te werken. Moet nog wat netter gemaakt worden, maar het werkt. Omzetten naar een waarde maar dan een faktor 10 te hoog. Vijf er bij tellen en delen door 10 en dan afronen. Wel erg omslachtig.
dat van erbij tellen en delen door tien is echt een fout iets.
Gewoon echt een getal van maken (dus met een punt ipv een komma) en niet wijzigen oid.
Laat gebruiker gerust een punt of komma invullen, maar zet het zelf om naar een punt en maak er een float van!
Regel 12 hierboven gaat waarschijnlijk niet goed werken. Wat als er 2 regels tekst in staan?
Hoe moet ik dat optellen en delen dan regelen? Als ik middels het commmando doubleval nu eindelijk e.e.a. goed heb staa, alleen de komma staat nog verkeerd, is delen toch een oplossing?
Er is geen gebruiker die wat invult, het is een thermometer die iets wegschrijft in een .dat bestand wat ik dus wil uitlezen en afgerond wil weergeven.
@Wouter.
Bij een temperatuur op dit moment van 20,6 gaat dit inderdaad ook goed. Even wachten tot we zakken naar 20,4
[size=xsmall]Toevoeging op 19/06/2012 19:04:30:[/size]
en inderdaad bij 20,4 (19.04 uur) geeft hij keurig 20 aan. Ik denk dat dit dus de oplossing is.
[size=xsmall]Toevoeging op 19/06/2012 20:11:10:[/size]
Inmiddels is de temperatuur van 20,1 opgelopen naar 20,9 en weer terug en de afronding blijft goed gaan. Wouter, jouw oplossing lijkt dus de juiste te zijn.
Bedankt allen voor het meedenken en als er nog betere ideeën zijn hoor ik ze graag.
Even een korte uitleg, zodat iedereen het kan begrijpen:
<?php
$tempt = str_replace(',', '.', $text);
?>
Replace de , in een . zodat PHP begrijpt dat daar de grens tussen hele getallen en decimalen ligt.
<?php
$tempt1 = (float) $tempt;
?>
Maakt van de string een float. In php is een heel getal een integer (int) en een komma getal een float.
<?php
$tempu = round($tempt1);
?>
Rond vervolgens de float af op een wiskundige juiste methode.
Als je floor gebruikt rond hij altijd naar beneden af.