Wie ich es verstehe, haben Ruby (1.9.2) Floats eine Genauigkeit von 15 Dezimalziffern. Daher würde ich erwarten, dass das Runden von float x auf 15 Dezimalstellen gleich x wäre. Für diese Berechnung ist dies nicht der Fall.
%Vor%Die Rundung auf 16 Stellen ergibt übrigens true.
Können Sie mir das bitte erklären?
Ein Teil des Problems besteht darin, dass 0.33 im zugrunde liegenden Format keine exakte Darstellung hat, weil es nicht durch eine Reihe von 1/2 n Begriffen ausgedrückt werden kann. Wenn es also mit 10 multipliziert wird, wird eine Zahl multipliziert, die geringfügig von 0.33 abweicht.
Dafür hat 3.3 auch keine exakte Darstellung.
Teil eins
Wenn Zahlen keine genaue Basis-10-Darstellung haben, wird es einen Rest geben, wenn die niedrigstwertige Ziffer, für die Informationen in der Mantisse vorhanden waren, konvertiert wird. Dieser Rest wird sich möglicherweise für immer nach rechts ausbreiten, ist aber weitgehend bedeutungslos. Die scheinbare Zufälligkeit dieses Fehlers ist auf den gleichen Grund zurückzuführen, der die scheinbar inkonsistente Rundung erklärt, die Sie und Matchu bemerkt haben. Das ist Teil zwei.
Teil zwei
Und diese Information (die am weitesten rechts liegenden Bits) ist nicht sauber mit der Information ausgerichtet, die von einer einzelnen Dezimalziffer übermittelt wird, so dass die Dezimalziffer typischerweise etwas kleiner ist als ihr Wert gewesen wäre, wenn die ursprüngliche Genauigkeit größer gewesen wäre.
Dies ist der Grund, warum eine Konvertierung bei 15 Ziffern auf 1 und bei 16 auf 0.x gerundet werden kann: weil eine längere Umwandlung keinen Wert für die Bits rechts vom Ende der Mantisse hat.
Nun, obwohl ich mir nicht sicher bin, wie Ruby interne Variablen steuert, weiß ich, warum dieses spezielle Bit in meiner Box nicht funktioniert:
%Vor%Der erste Gleitkommawert enthält 16 Dezimalstellen für insgesamt 17 Ziffern, aus welchen Gründen auch immer. Runden auf 15 werden diese Ziffern also verworfen.
Tags und Links ruby floating-point floating-accuracy