Berechnungs-Problem
Zostex
- programmiertechnik
Hallo,
habe da mal einen kleinen Frage:
Schreibe Daten in eine MySQL Tabelle, die sich aus einer vorherigen Berechnung ergeben:
55,05 - 48,2 = 1,85
56,59 - 55,26 = 1,33
35,55 - 33,54 = 2,01
57,89 - 55,3 = 2,59
Das Ergebnis wird dann in eine entsprechende Spalte.
Allerdings soll dies vorher so formatiert werden, dass nur der Wert bei vollen 0,25 Punkten angegeben werden woll, d.h.
für 1,85 soll dann 1,75 gespeichert werden und
für 1,33 soll dann 1,25 gespeichert werden und
für 2,01 soll dann 2,00 gespeichert werden und
für 2,59 soll dann 2,50 gespeichert werden
Ich hoffe jemed versteht was ich meine.
Leider kriege ich das nicht hin - ist wohl ein mathematisches-Problem :-).
Wäre nett, wenn jemand ne Lösung hat....
Danke
Auch hallo,
für 1,85 soll dann 1,75 gespeichert werden und
für 1,33 soll dann 1,25 gespeichert werden und
für 2,01 soll dann 2,00 gespeichert werden und
für 2,59 soll dann 2,50 gespeichert werden
Nimm den Wert * 4, runde ihn, und teile dann wieder durch 4 (ggfs. noch formatieren auf 2 Nachkommastellen, falls nötig):
1,85 -> 7,4 -> 7 -> 1,75
1,33 -> 5,32 -> 5 -> 1,25
2,01 -> 8,04 -> 8 -> 2,00
2,59 -> 10,36 -> 10 -> 2,50
Gruß,
paschef
Nimm den Wert * 4, runde ihn, und teile dann wieder durch 4 (ggfs. noch formatieren auf 2 Nachkommastellen, falls nötig):
Vielen, vielen Dank für die superschnelle Hilfe ... hätte wohl im MatheLK mal aufpassen müssen ...
Vielen, vielen Dank für die superschnelle Hilfe ... hätte wohl im MatheLK mal aufpassen müssen ...
Hat mir (rückblickend betrachtet) aber auch nicht viel geholfen ;-)
Noch ne Kleinigkeit:
Wenn ich jetzt negative werte habe, klappts nicht ;-(
D.h. aus -36,63 wird dann -36,75, wobei dafür doch auch nur -36,50 herauskommen sollte.
Gits da auch ne Lösung???
Momentan mach ich's so:
$ueber_diff = $dauer_ges[0]-$soll_gesamt;
$ueber_format =round($ueber_diff*4);
$ueber_show=$ueber_format/4;
Kannst Du mir da nochmal helfen....
Daaaanke!
Noch ne Kleinigkeit:
Wenn ich jetzt negative werte habe, klappts nicht ;-(
D.h. aus -36,63 wird dann -36,75, wobei dafür doch auch nur -36,50 herauskommen sollte.
$ueber_diff = $dauer_ges[0]-$soll_gesamt;
$ueber_format =round($ueber_diff*4);
$ueber_show=$ueber_format/4;
Für +36,63 sieht's übrigens genauso aus. D.h. Du willst nur "zur Null hin" runden, nicht kaufmännisch oder so ?
Dann auf die Schnelle so (mehr quick&dirty):
$ueber_diff = $dauer_ges[0]-$soll_gesamt;
if ($ueber_diff < 0)
{
$ueber_show = number_format(((floor($ueber_diff*4))/4),2);
}
else
{
$ueber_show = number_format(((ceil($ueber_diff*4))/4),2);
}
Aber ohne Gewähr (mein Taschenrechner sagt, das passt...)
Vielleicht gibt es auch statt "floor" und "ceil" Funktionen, die immer zur Null hin runden, aber (ausser umständlich über Betragsfunktionen) da kenn ich nix.
Gruß,
pschef
War genau falschrum (ceil und floor), sorry !
$ueber_diff = $dauer_ges[0]-$soll_gesamt;
if ($ueber_diff < 0)
{
$ueber_show = number_format(((ceil($ueber_diff*4))/4),2);
}
else
{
$ueber_show = number_format(((floor($ueber_diff*4))/4),2);
}
Gruß,
paschef
Danke!
Und eine letzte Frage, hoffe ich bin nicht zu unverschämt, finde aber nirgend eine Hilfe dazu.
Meine Daten sind Zeitangaben, genau gesagt Überstunden!
Allerdings nicht im Stunden/Minutenformat!
D.h. 4,25 wären eigentlich 4 Stunden und 15 Minuten.
Gibts da ne Funktion zur Umrechnung? Jedenfalls wies ich nicht wie in PHP.
Es soll also aus 4,25 folgendes werden: 4 Stunden, 15 Minuten
Danke. Das soll nun aber die letzte Frage sein....
Danke!
Bitte
Und eine letzte Frage, hoffe ich bin nicht zu unverschämt, finde aber nirgend eine Hilfe dazu.
Meine Daten sind Zeitangaben, genau gesagt Überstunden!
Allerdings nicht im Stunden/Minutenformat!
D.h. 4,25 wären eigentlich 4 Stunden und 15 Minuten.
Gibts da ne Funktion zur Umrechnung? Jedenfalls wies ich nicht wie in PHP.
Es soll also aus 4,25 folgendes werden: 4 Stunden, 15 Minuten
Wusste ich's doch, das es um Arbeitszeit geht. Das Problem kenne ich nämlich....
Ich hab das damals (umständlich vielleicht, aber funktioniert seit 2 Jahren) für die Anzeige etwa so gelöst:
$minuten = ($zeitwert * 60) % 60; //modulo 60
$erg = floor($zeitwert) .":". $minuten;
Hier:
(4,25 * 60) % 60 -> 15
4 .":". 15 -> 4:15
Hinweis: Die modulo-Funktion liefert dasselbe Vorzeichen
(-4,25 * 60) % 60 -> -15
Also evtl. doch mal über Betragsfunktionen nachdenken. Oder über den Sinn von negativen Überstunden ;-)
Wenn Du da noch mehr Probleme hast (Benutzereingaben hin- und herrechnen), dann pas@exquit.com
Danke. Das soll nun aber die letzte Frage sein....
Bei Zeiterfassung ? Sei Dir mal nicht so sicher...
Gruß,
paschef
Für +36,63 sieht's übrigens genauso aus. D.h. Du willst nur "zur Null hin" runden, nicht kaufmännisch oder so ?
Kleines Missverständnis!!!
Ich will eben genau das andere! Also nicht "nur zur Null hin"
Deshalb funzt es ja mit +36,63 aber nicht mit -36,63.
Es soll also bis +36,63 nur +36,50 angezeigt werden, genauso für -36,63 dann -36,50
Dann auf die Schnelle so (mehr quick&dirty):
Vielen Dank. Würde das auch mal so auf die Schnelle können ...
Will echt nicht nerven. Jetzt bin ich aber schon so weit, und hoffe Du hilfst mir jetzt noch einmal ... :-)
Für +36,63 sieht's übrigens genauso aus. D.h. Du willst nur "zur Null hin" runden, nicht kaufmännisch oder so ?
Kleines Missverständnis!!!
Ich will eben genau das andere! Also nicht "nur zur Null hin"
Deshalb funzt es ja mit +36,63 aber nicht mit -36,63.
Es soll also bis +36,63 nur +36,50 angezeigt werden, genauso für -36,63 dann -36,50
Abgesehen davon, dass ich das Codebeispiel noch mal korrigieren musste (s. Posting)... gehen wir's mal in Ruhe durch:
+36,63 -> 36,50 (also "floor", nach unten)
-36,63 -> -36,50 (also "ceil", nach oben)
Falls Du
-36,63 -> -36,75 haben willst, dann nimm immer "floor" und spar Dir die if-Abfrage:
$ueber_diff = $dauer_ges[0]-$soll_gesamt;
$ueber_show = number_format(((floor($ueber_diff*4))/4),2);
Ich hoffe, das ist das Gesuchte ?
Will echt nicht nerven. Jetzt bin ich aber schon so weit, und hoffe Du hilfst mir jetzt noch einmal ... :-)
Aber gerne. Hier regnet's eh...
Jetzt verstehe ich Dich: Du willst die Grenze nicht genau bei 36,625 haben, sondern erst _nach_ 36,63.
Oder ?
Das ist allerdings komplizierter. Mal sehen.
Gruß,
paschef
Noch ne Kleinigkeit:
Dito
Grundsätzlich sollte man, falls möglich, eher "floor" und "ceil" statt "round" einsetzen.
Falls z.B. 5,5 intern als 5,4999999999999999 dargestellt wird, dann liefert
round(5,5) -> 5
Aber bevor hier eine Numerik-Diskurs losbricht:
Schönen Sonntag noch ;-)
Gruß,
paschef
Auch hallo,
für 1,85 soll dann 1,75 gespeichert werden und
für 1,33 soll dann 1,25 gespeichert werden und
für 2,01 soll dann 2,00 gespeichert werden und
für 2,59 soll dann 2,50 gespeichert werden
Nimm den Wert * 4, runde ihn, und teile dann wieder durch 4 (ggfs. noch formatieren auf 2 Nachkommastellen, falls nötig):
1,85 -> 7,4 -> 7 -> 1,75
1,33 -> 5,32 -> 5 -> 1,25
2,01 -> 8,04 -> 8 -> 2,00
2,59 -> 10,36 -> 10 -> 2,50
Oops, da sollte noch ein Beispiel (hier PHP) dazu:
$wert = 1.85;
$erg = number_format(((round($wert*4))/4),2);
Gruß,
paschef