Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-09-2005, 16:16   #1 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Beiträge: 9
Question erklärungsbedarf bei Math.floor

ich bin gerade am verzweifeln, kann sein das der tag so lang war und ich nicht mehr weiss was sache ist .

also ich habe einen falschen rundungswert, warum ich es so machen musste, erzähl ich glaube ich erst wenn es wirklich wirklich wichtig für dieses komische verhalten sein sollte.

also folgendes problem:
ActionScript:
  1. on (press) {
  2.     zurundenerwert = 122.12;
  3.     dezimalzahl = Math.floor(zurundenerwert*100)*0.01;
  4.     trace(dezimalzahl);
  5. }

dezimalzahl sollte wieder 122.12 sein, das ist sie auch in diesem beispiel.

nur tritt bei mir aufeinmal ein fehler auf sobald die zahl vor dem komme in den tausender bereich geht:
ActionScript:
  1. on (press) {
  2.     zurundenerwert = 1222.12;
  3.     dezimalzahl = Math.floor(zurundenerwert*100)*0.01;
  4.     trace(dezimalzahl);
  5. }
nun kommt nicht mehr 1222.12 raus sondern flash rundet wirklich ab wo es eigentlich nichts zum abrunden gibt: 1222.11

momentan fällt mir nicht ein wieso er das macht, vielleicht kann mir einer zur späten stunde helfen.

würd mir schon reichen wenn mir mal einer sagt wie man in flash typen zuweist, weil ich das problem ja auch lösen könnte indem ich mal abfrage ob der wert ein float oder ein integer ist, nur kann man meines wissens nach flash nicht direkte typen zuweisen oder?
ok man könnte natürlich auch mit einem split arbeiten und immer die erste zahl aus dem array holen, das mit den arrays wollte ich aber eigentlich vermeiden.

entweder stehe ich momentan voll auf den schlauch oder das problem ist wirklich sonderbar.

LG
vornie
vornie ist offline   Mit Zitat antworten
Alt 27-09-2005, 18:40   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.322
dezimalzahl = Math.round(zurundenerwert*100)/100;

trace(Math.floor(9.9));
trace(Math.ceil(9.1));

round rundet bei 0.5
floor rundet immer ab
ceil immer auf
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 27-09-2005, 19:20   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Oh, da bist du auf ein böses Problem gestoßen …
Vermutlich liegt das irgendwie daran, dass Flash intern nicht im Dezimalsystem rechnet, dadurch kann es passieren, dass eine 1100.12 * 100 in seinem Zahlensystem aussieht wie 110011.999999999 und deshalb von Math.floor abgeschnitten wird.

hier ein kleiner, dreckiger Workaround:
ActionScript:
  1. function floor(x) {
  2.     return Number(String(x).split(".")[0]);
  3. }
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-09-2005, 20:52   #4 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Beiträge: 9
@ janoscharlippe

danke erstmal,

ja da ist es mit dem split

dieses array wollte ich eigentlich vermeiden, da es mehr schreibarbeit ist

hm, dann muss ich es vielleicht doch machen obwohl es nicht schön ist *g*

@hgseib

das problem ist er soll immer abrunden, abrunden ist hier die voraussetzung.
es können auch zahlen kommen mit 5 oder 6 kommastellen, von diesen kommastellen brauche ich aber nur 2 und zwar immer ab der 3ten stelle abgerundet. ( daher mal 100 und anschliessend wieder mal 0,01 )

mein problem sieht man ja wenn da nur 2 kommastellen vorhanden sind und die zahl dann die tausendergrenze überschreitet.
wie schon oben gesagt einfach abfragen ob es ein integer oder ein float ist kann man auch nicht in flash bzw. flash sagen das ist ein float und das ein integer.

vielleicht doch noch eine idee ohne split?
vornie ist offline   Mit Zitat antworten
Alt 28-09-2005, 01:52   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.322
binär ist das immer (früher konnte man im maschinencode noch im BCD-code arbeiten, war für kaufleute. da wird eine zahl pro nibble gespeichert).
wird eine zahl in ein text umgewandelt, dann kommt gewissermassen auch Math.round zum einsatz. nur halt ein paar kommastellen weiter hinten.
dashalb geht hierführ z.b. auch:

zurundenerwert = 1222.12959996;
zurundenerwert = Math.floor(Math.round(zurundenerwert*1e9)/1e7)/1e2;
trace(zurundenerwert);

-------------
"..es können auch zahlen kommen.."
denn du die zahlen übers internet beziehst, dann sind die zuerst sowieso text, da kannst du auch die funktion von Janoscharlipp nehmen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (28-09-2005 um 03:16 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 28-09-2005, 08:04   #6 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Beiträge: 9
hi hgseib, ja also das geht auch, kannste mir das trotzdem nochmal das mit dem "*1e9" usw. erklären. das versteh ich momentan nicht mit den "e". ich werd selber nochmal nachgucken ob ich was darüber finde. aber sicherheitshalber erklärs nochmal .

THX
vornie
vornie ist offline   Mit Zitat antworten
Alt 28-09-2005, 08:45   #7 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 283
Das "e" steht für nix anderes als Exponent. Also ist 1e9 (1exp(9)) auch gleich 1000000000 also eine 1 mit 9 Nullen. (1e2 = 100)
__________________
ein mensch ohne macke ist kacke...
DaKinel ist offline   Mit Zitat antworten
Alt 28-09-2005, 09:04   #8 (permalink)
Neuer User
 
Registriert seit: Apr 2005
Beiträge: 9
ja habs gerade auch herausgefunden , hätte mir auch gleich einfallen müssen, habs aber noch nie in flash benutzt.

danke

Geändert von vornie (28-09-2005 um 09:05 Uhr)
vornie ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele