> ## Documentation Index
> Fetch the complete documentation index at: https://docs.baenninger.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Mathematische Operationen

In JavaScript sind Zahlen immer Floating Point Numbers﻿, egal ob sie eine ganze Zahl, wie `101` oder eben `3.141` ist. Das können wir auch ganz einfach überprüfen:

```javascript theme={null}
console.log(23 === 23.0); // true
```

## Floating Point Numbers﻿

Die Präzision von Floating Point Numbers ist stark begrenzt, da solch eine Zahl mit dem Binärsystem dargestellt wird. So kann z.B. folgendes passieren:

```javascript theme={null}
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
```

<Info>
  Hier müssen wir einfach aufpassen, da wir es als Fehler von JavaScript bzw. allgemein von Computern hinnehmen müssen.
</Info>

## Konversion﻿

Es gibt mehrere Möglichkeiten einen Wert in eine Zahl zu konvertieren:

```javascript theme={null}
console.log(Number('23')); // 23
console.log(+'23'); // 23

console.log(Number.parseInt('30px', 10)); // 30
console.log(Number.parseFloat('2.5rem')); // 2.5
```

Die beiden letzteren nennt man auch *Parsing* und ist nützlich um auch Strings mit Suffixen, z.B. CSS-Werten, in Zahlen umzuwandeln.

## Überprüfung﻿

Es gibt hauptsächlich zwei Methoden, um zu überprüfen, ob eine Zahl auch wirklich eine Zahl ist: `isNaN()` und `isFinite()`. Letzteres ist dabei deutlich zuverlässiger, da es auch Werte, wie `Infinity` abfangen kann:

```javascript theme={null}
console.log(Number.isNaN(20)); // false
console.log(Number.isNaN('20')); // false
console.log(Number.isNaN(+'20X')); // true
console.log(Number.isNaN(23 / 0)); // false

console.log(Number.isFinite(20)); // true
console.log(Number.isFinite('20')); // false
console.log(Number.isFinite(+'20X')); // false
console.log(Number.isFinite(23 / 0)); // false
```

## Wurzeln

Wir können Wurzeln mit der `sqrt()`-Methode beschreiben. Natürlich sind aber auch Brüche im Exponenten möglich um Wurzeln darzustellen:

```javascript theme={null}
console.log(Math.sqrt(25)); // 5
console.log(25 ** (1 / 2)); // 5
console.log(8 ** (1 / 3)); // 2
```

## Aggregatfunktionen

JavaScript stellt uns zwei Aggregatfunktionen zur Verfügung, `min()` und `max()`:

```javascript theme={null}
console.log(Math.max(5, 18, 23, 11, 2)); // 23
console.log(Math.min(5, 18, 23, 11, 2)); // 2
```

## Konstanten

Zudem gibt uns JavaScript Zugriff auf die Konstanten π und e (Eulersche Zahl):

```javascript theme={null}
console.log(Math.PI); // 3.141592653589793
console.log(Math.E); // 2.718281828459045
```

## Random

Die `random()`-Funktion ermöglicht uns die Erstellung von zufälligen Zahlen:

```javascript theme={null}
console.log(Math.random());
console.log(Math.random() * 100);
console.log(Math.trunc(Math.random() * 100));
```

## Runden﻿

### Auf Ganzzahlen runden﻿

Beim Runden gibt es essenziell vier Methoden:

* `trunc()`: entfernt alle Nachkommastellen
* `round()`: rundet nach mathematischen Gesetzen auf die nächste Ganzzahl
* `ceil()`: rundet immer auf
* `floor()`: rundet immer ab

```javascript theme={null}
console.log(Math.trunc(23.3)); // 23

console.log(Math.round(23.3)); // 23
console.log(Math.round(23.9)); // 24

console.log(Math.ceil(23.3)); // 24
console.log(Math.ceil(23.9)); // 24

console.log(Math.floor(23.3)); // 23
console.log(Math.floor(23.9)); // 23
```

### Auf Dezimalzahlen runden﻿

Um auf Dezimalzahlen zu runden, nutzen wir die Methode `toFixed()`.

```javascript theme={null}
console.log((2.7).toFixed(0)); // "3"
console.log((2.7).toFixed(3)); // "2.700"
console.log((2.345).toFixed(2)); // "2.35"

console.log(+(2.7).toFixed(0)); // 3
console.log(+(2.7).toFixed(3)); // 2.7
```

<Warning>
  Die Methode `toFixed()` gibt einen **String** aus und keine Zahl!
</Warning>
