auf zwei nachkommastellen begrenzt, bei bestimmter Zahl funktioniert es nicht?

2 Antworten

Möglicherweise liegt es daran, dass Gleitkommazahlen (binär gespeichert, in dezimal dargestellt Lücken aufweisen. Die Zahlen werden meistens so angeordnet, dass sie um 0 herum möglichst dicht sind.

Du musst dir das so vorstellen: Computer haben eine endliche Menge an Zahlen, die sie mit dem Typ Gleitkommazahl darstellen können. Du hast zum Beispiel 2^64 verschiedene Zahlen zur Verfügung. Bei Ganzzahlen ist es einfach. Entweder du fängst bei 0 an und zählst bis ~ 2^64 oder du gehst von -2^63 bis 2^63 in Einerschritten (grob gesprochen).
Es gibt allerdings unendlich viele Dezimalzahlen allein schon zwischen 0 und 1, erst recht bei größeren Zahlenbereichen. Also müssen die zur Verfügung stehenden Zahlen auf den Bereich verteilt werden.
Wie es aussieht, "trifft" 15608 zufällig keinen zugeordneten Wert. ?REST(I22*100;1) ergibt einen Wert, der sich marginal von 0 unterscheidet, nämlich
1,81899E-12. Deswegen arbeitet man normalerweise beim Prüfen von Gleitkommazahlen auf Gleichheit mit Epsilonumgebungen.

Das heißt, du müsstest so etwas in der Art formulieren:

=REST(I22*100;1)<0,00001

oder du definierst dir einen Namen eps als 0,0001 und fragst REST(...)<eps ab.

Oder du nutzt Funktionen, die so geschrieben wurden, dass sie diesen Fehler von Haus aus ausgleichen, wie die eingebauten Rundungsfunktionen.


Suboptimierer  13.05.2024, 12:21

In meinen Tests funktioniert das hier:

GANZZAHL(I22*100)/(I22*100)=1

0
userone307 
Fragesteller
 13.05.2024, 14:39

Hallo Suboptimierer. Ich danke dir sehr für die Erklärungen und werde es so bald wie möglich ausprobieren. Ich melde mich dazu sicher noch mal.

1
userone307 
Fragesteller
 16.05.2024, 10:27

Lieber Suboptimierer,

die Formel: =REST(I22*100;1)<0,00001 funktioniert nun bei der Zahl 157,08 und auch bei der 156,08 jedoch leider nun nicht mehr bei der Zahl 10.201,13.

Hast du noch eine Idee wie ich die Eingabe einer Zahl auf zwei Nachkommastellen begrenzen kann, ohne das gerundet wird. Der höchste mögliche einzutragende Wert liegt im 100.000der Bereich.

In meiner Excel-Tabelle sollen Ausgaben aufgeführt werden, leider errechnen die Personen manche Ausgaben prozentuell und kopieren dann die Zahl die sie in ihrer Berechnungstabelle sehen (die jedoch unsichtbar mehr als 2 Nachkommastellen hat) in meine Tabelle, so kommt es zu Rundungsfehlern. Mit der Begrenzung auf die Eintragung von nur 2 Nachkommastellen wollte ich die Fehlerquelle ausschalten.

0

Es wundert mich, dass du meinst, dass deine Formel normalerweise den gewünschten Zweck erfüllt.

Denn die REST()-Funktion macht etwas ganz anderes, als du beschreibst: Sie liefert der Rest einer Division.

Zum Runden gibt es die RUNDEN()-Funktion. Dieses Beispiel rundet die Zahl in I22 auf 2 Nachkommastellen:

=RUNDEN(I22;2)

userone307 
Fragesteller
 13.05.2024, 10:15

Lieber ultarunner, danke für deine schnelle Nachricht. Ich möchte jedoch nicht runden, in die Zelle darf nur ein Wert mit 2 Nachkommastellen eingefügt werden. Wenn es mehr Nachkommastellen sind wirft excel die Fehlermeldung: Nur zwei Dezimalstellen zulässig aus. Wie beschrieben funktioniert es bei vielen von mir getesteten Zahlen aber bei 157,08 und 156,08 nicht. Bei anderen Zahlen die mit x,08 enden gibt es auch keine Probleme.

Mit deiner Formel würde er eine Eingabe auf 2 Nachkommastellen runden, was sich in meiner Tabelle jedoch nicht verwenden lässt, da Rechnungsbeträge nie mehr als 2 Nachkommastellen haben dürfen. Vielleicht kann die Formel auch nicht korrekt sein, hast du ja noch eine Idee für mich.

0
ultrarunner  13.05.2024, 10:29
@userone307

OK, dann sollte deine eigentlich passen. Bei mir funktioniert diese auch für 157,08 und 156,08.

Bedenke allerdings, dass es beim Rechnen mit Gleitkommazahlen Rundungsfehler geben kann, die Tests auf Gleichheit zum Scheitern verurteilen, weil da intern irgendwo 157,0800000001 herauskommt.

Vielleicht soltest du das Resultat nicht mit Null vergleichen, sondern dessen Absolutbetrag mit einer sehr kleinen Zahl vergleichen.

Oder du wandelst die Eingabe in einen String und testest die Anzahl der Nachkommastellen mit Stringfunktionen.

1