Rolf B: rechnen mit Winkelfunktionen

Beitrag lesen

Hallo matze511,

abgesehen von den Winkeleinheiten, die Gunnar benannte, hätte ich folgende Anmerkungen:

  • die Funktion heißt addieren, tut aber nachweislich mehr als das. Ich sehe eine Multiplikation und einen Tangens. Benenne deine Funktionen so, dass ihr Zweck aus dem Namen ersichtlich ist.

  • Du deklariest deine Variablen nicht. Damit werden globale Variablen daraus, die ihren Wert auch behalten, wenn die Funktion beendet ist. Ich bin sicher, dass das nicht deine Absicht ist. Verwende const, wenn du der Variablen nur einmal einen Wert zuweist und sie dann ihren Wert behält, oder let, wenn Du während eines Funktionsdurchlaufs den Wert zuweisen und nochmal ändern musst.

// so
   const grundmaß = parseFloat(...);
// oder so
   let grundmaß = parseFloat(...);
  • Du liest den value aus den Eingabefeldern. Sind das Texteingabefelder? Wenn ja, dann musst Du das so tun, ABER du hast auch das Problem, dass die Eingabewerte möglicherweise keine Float-Zahl darstellen. D.h. parseFloat liefert Dir eventuell NaN (not a number). Damit weiterzurechnen führt am Ende zu NaN in der firsthöhe, und das möchtest Du nicht im Ausgabefeld sehen. Frage also mit isNaN() ab, ob du eine gültige Zahl hast.
    Oder besser: probiere input type="number" aus. Setze den step-Wert so, dass die Zahl der Nachkommastellen für den Sachverhalt passt. Dann kannst Du den Eingabewert mit valueAsNumber statt value abholen und hast gleich eine Zahl. Die Frage "Dezimalkomma oder Dezimalpunkt" löst dann der Browser für Dich.

  • Du klammerst Math.tan(wert) ein. Das ist nicht kein Fehler, aber unnötig

  • Du berechnest die Firsthöhe mit einer Formel. Auf das Ergebnis wendest Du toPrecision(4) an, um auf 4 Nachkommastellen zu runden, dann machst Du mit parseFloat() wieder eine Zahl daraus. Wenn es Dir nur um die gerundete Darstellung geht, dann lass das parseFloat weg. Wenn du mit dem gerundeten Wert weiterrechnen willst, dann - ja - hast Du eine fehlendes JavaScript-Feature gefunden: Runden auf N Nachkommastellen. Ob man nun mit parseFloat(x.toPrecision(4)) arbeitet oder mit Math.round(x*10000)/10000, ist wohl eher egal. Aber wenn Du das öfter tun musst, schreib Dir eine Funktion. Das ist zwar mehr Code, aber weniger Rechenaufwand für den Computer.

function runden(wert, stellen = 0) {
   const skalierung = 10 ** stellen;
   return Math.round(wert * skalierung) / skalierung;
}
  • Ein Grundprinzip der Programmierung heißt DRY (Don't Repeat Yourself). Das tust Du aber reichlich. Schreibe Dir eine Hilfsfunktion, um einen Float-Wert aus einem Eingabefeld zu bekommen, wenn Du bei input type="text" bleiben willst:
function getFloatValue(id) {
   const element = document.getElementById(id);
   if (element)
      return parseFloat(element.value.replace(',', '.'));
   else
      return NaN;
}

function berechnen() {
   const grundmaß       = getFloatValue('grundmaß'),
         dachneigung    = getFloatValue('dachneigung') / 180 * Math.PI, 
         ...
         raumhöheRohbau = getFloatValue('raumhöheRohbau');

   const firsthöhe = (grundmaß + dachüberstand) * Math.tan(dachneigung);

   document.getElementById('firsthöhe').value = firsthöhe.toPrecision(4);
}

Die Dachneigung rechne ich gleich beim Auslesen ins Bogenmaß um.

Beachte in dem mehrzeiligen const: jede Deklaration endet mit einem Komma, außer der letzten, da muss das Semikolon stehen, dass das Statement beendet

Wegen der Verwendung von toPrecision: siehe weiter oben…

Rolf

--
sumpsi - posui - obstruxi