Das Problem ist, dass einige Zahlen, die wir einfach schreiben können in Dezimalzahlen haben keine genaue Darstellung in dem speziellen Fließkommaformat, das von aktueller Hardware implementiert wird. Eine lässige Art, dies zu sagen, ist, dass alle Ganzzahlen tun, aber nicht alle Brüche, weil wir normalerweise die Fraktion mit einem 2**e
Exponenten speichern. Also, Sie haben 3 Möglichkeiten:
Runden Sie entsprechend ab. Das nicht gerundete Ergebnis ist immer sehr nah, also ist ein rundes Ergebnis immer "perfekt". Dies ist, was Javascript tut und viele Leute bemerken nicht einmal, dass JS alles im Gleitkomma-Punkt erledigt.
Verwenden Sie Festkommaarithmetik. Ruby macht das wirklich sehr leicht. Es ist eine der wenigen Sprachen, die von Fixnum nahtlos in die Klasse Bignum wechselt, wenn die Zahlen größer werden.
eine Klasse verwenden, die dieses Problem zu lösen, wie BigDecimal
das Problem im Detail zu sehen konzipiert ist, können wir versuchen, Ihre „7.3“ in binär darzustellen. Der 7 Teil ist einfach, 111, aber wie machen wir .3? 111.1 ist 7.5, zu groß, 111.01 ist 7.25, kommt näher.Stellt sich heraus, 111.010011 ist die "nächstkleinere kleinere Zahl", 7.296875, und wenn wir versuchen, die fehlende .003125 auszufüllen, finden wir schließlich heraus, dass es nur 111.010011001100110011 ... für immer in unserer endlichen Bitfolge nicht darstellbar ist .
Rechts. Dies gilt unabhängig von der Sprache - darunter leiden Java, Ruby und C#. Dies liegt an der Wahl der binären Logik und unserer Art, Gleitkommazahlen darzustellen. – duffymo