- Offizieller Beitrag
Hey,
Hab folgendes Problem: Benutze ein Modulo um herauszufinden, ob eine Zahl eine Nachkommastelle hat. Falls ja soll die Zahl mit 10 Multipliziert werden und der Multiplikator einen runter gerechnet werden damit später die Zahl wieder als float beschrieben werden kann (iVal * 10 ^ iMul). Funktioniert auch meistens relativ gut. Aber bei paar Zahlen macht der Modulo mist. Es funktioniert zwar auch, gibt mir aber ein viel zu großen übertriebenen Modulo zurück.
Hier mal ein Beispiel. Kann sich das jemand erklären?!
Value ist 9.73. Der errechnete Multiplier sollte -2 sein und die Value dann 973.
Der Multiplier ist bei mir aber -15 und die Value dementsprechend 9.73e+015
Spoiler anzeigen
;~ $iTest =9.75;<--funktioniert
$iTest =9.73;<--funktioniert zwar auch, aber mit viel zu vielen schritten
$iMult = 0
While Mod($iTest,1)
ConsoleWrite($iTest&":"&Mod($iTest,1) & @CRLF);Hier zeigt er bei 973 folgendes an: 1.13686837721616e-013
$iTest *= 10
$iMult -= 1
WEnd
ConsoleWrite(Mod(973,1) & @CRLF);Hier zeigt er bei 973 richtigerweise 0 an?!
ConsoleWrite("iTest: "&$iTest & @CRLF)
ConsoleWrite("iMult: "&$iMult & @CRLF)
ConsoleWrite($iTest*10^$iMult & @CRLF)
Lieben Gruß,
Spider
p.s.: Ist das nicht ne schöne Alliteration im Titel?
Edit: Ha.. Hätt ich mal in die Hilfe geschaut. "This function does not guarantee that dividend or divisor can be represented, specifically with floating point numbers."
Lustig.. Das heißt es gibt die Funktion, aber es wird nicht garantiert das sie auch Funktioniert... Nagut, dann muss ichs halt doch alternativ so machen:
Spoiler anzeigen
$iTest =9.73
$iMult = 0
While Not (Int($iTest) == $iTest);Leider mit doppel =, da wir hier tatsächlich ein String vergleichen müssen. Einfaches = gibt auch ein zu hohen Multiplier aus
$iTest *= 10
$iMult -= 1
WEnd
ConsoleWrite("iTest: "&$iTest & @CRLF)
ConsoleWrite("iMult: "&$iMult & @CRLF)
ConsoleWrite($iTest*10^$iMult & @CRLF)