Nico Grebner wrote:
> ich habe ein Problem beim Runden einer Zahl. Ich muss diese Zahl einmal
> auf- und einmal abrunden, um eine Interpolation durchzuführen.
>
> Hierzu verwende ich folgenden (verkürzten) code:
[Quelltext auf das Wesentliche reduziert und lesbar formatiert]
> ####
> {
^
Das ist *so* eine überflüssige Block-Anweisung (oder ist das bloss Dein
missglückter Versuch, in einem Klartextmedium Quelltext als solchen
auszuzeichnen?). Sie sorgte _nicht_ dafür, dass der darin eingeschlossene
Code lokal ist. Sie sorgte allerdings dafür, dass
> function test2 ()
> {
> var tst = getFactor(0.24, 6);
^^^^
> }
nicht standardkonform wäre, denn Funktionsdeklarationen sind gemäss Standard
(ECMAScript Language Specification, 5.1 Edition) innerhalb von Block-
Anweisungen nicht erlaubt.
> function getFactor(m, h)
> {
> switch (m)
> {
> case 0.2: return m * (1 + 0.044 * (h - 4.5));
^^^
> case 0.3: return m * (1 + 0.066 * (h - 4.5));
^^^
> default:
> var lowerM = Math.floor(m * 10) * 0.1;
> var upperM = Math.ceil(m * 10) * 0.1;
> var lowerFactor = getFactor(lowerM, h);
> var upperFactor = getFactor(upperM, h);
> var interpolFactor =
> (upperFactor - lowerFactor)
> / (upperM - lowerM) * (m - lowerM) + lowerFactor;
> return interpolFactor;
> }
> }
>
> }
> ####
^^^^
> Ich erhalte die Fehlermeldung: Exceeded maximum stack depth (Zeile: var
> lowerFactor = getFactor(lowerM, h);)
> […]
> Wenn ich jetzt das Runden wie folgt ändere,
> ####
> {
^^^^
Schon wieder.
> var lowerM = Math.floor(m * 10) / 10;
> var upperM = Math.ceil(m * 10) / 10;
> }
> ####
^^^^
> läuft mein Code oben wie gewünscht und liefert das richtige Ergebnis. Das
> habe ich in Google Apps Script getestet.
IMHO reiner Zufall.
> Das ganze soll nun als „custom function“ in einem Google Spreadsheet
> laufen. Dort bekomme ich jedoch in der Zelle, in der ich die Funktion
> aufrufe, auch mit der letzten Änderung die Fehlermeldung: „Exceeded
> maximum stack depth“
>
> Der Fehler liegt ja offenbar darin, dass ich mit Math.floor(m * 10) die
> abgerundete Zahl (*10) bekomme und durch die Anweisung „/10“ bzw. „*0.01“
> eine nicht exakte Zahl bekomme (0.200000000001).
Richtig.
> Kann mir hier jemand weiterhelfen?
Ja. Die Antwort auf die Frage, die Du nicht gestellt hast, lautet jedoch:
So kann das nicht funktionieren. Standardkonforme ECMAScript-
Implementierungen verwenden schon immer als *einzigen* numerischen Datentyp
Fliesskommazahlen mit „doppelter Genauigkeit“ gemäss IEEE-754.
Übrigens empfehle ich Dir dringend, nicht über Google Groups ins Usenet zu
posten. Dessen Interface ist noch zusätzlich zu Deinem eigenwilligen
Postingstil völlig kapott.
<
http://www.tty1.net/smart-questions_de.html>
--
PointedEars
Twitter: @PointedEars2
Please do not Cc: me. / Bitte keine Kopien per E-Mail.