Double vs FLOAT - unklarer MathFloor-Fehler - Seite 7

 
Maxim Kuznetsov:
Je nach Ihren Zielen lohnt es sich manchmal, ganz auf ganze Zahlen umzusteigen. Das spart eine Menge Nerven :-) Als ich einmal eine Aufgabe hatte, bei der ich viele, viele Ebenen genau markieren musste, hatte ich zunächst Schwierigkeiten mit dem Doppelten, und dann habe ich alles in ganzzahlige Punkte von 0 umgewandelt, und alles wurde leicht, einfach und fehlerfrei.
Das ist genau das, was ich getan habe. Ich habe sie in ganze Zahlen umgewandelt.
 
Vladimir:

Sie brauchen nicht zu runden, es sei denn, die Aufgabe erfordert es.


Das ist es ja: Aufgaben sind unterschiedlich :-)

 

Wenn SieMathFloor oder MathCeil zum Runden verwenden, müssen Sie das ursprüngliche Ergebnis auf die richtige Genauigkeit normalisieren.

Denn bei der Berechnung kann es vorkommen, dass Sie statt einer ganzen Zahl eine Bruchzahl erhalten, und weil dieser "Schwanz" der Zahl falsch gerundet wird, ist das Ergebnis falsch.
Zum Beispiel:

double point=0.01;
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));

Versuchen wir nun, mitMathFloor abzurunden

double point=0.01;
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
 

Wenn ich die Zahl auf 1,05 normalisiere - wird sie auf 1,1 normalisiert, was im Prinzipnicht das ist, was ich mitMathFloor brauche :-)

Denn ich würdeMathFloor überhaupt nicht verwenden.

Aber das Problem ist ein anderes.

 

Но задача то другая.  

Warum ist das anders? Sie sagten, Sie müssten abrunden - MathFloor macht genau das.

 
Taras Slobodyanik:

Warum ist das anders? Sie sagten, Sie müssten abrunden - das macht MathFloor.

Ja!!.. aber wenn ich eine Normalisierung vornehme, wird die Mathematik abgerundet undMathFloor ergibt keinen Sinn.

 

das obige Beispiel mit der Zahl 1156,12, wird diese Zahl im Speicher als 1156,11999999999999891 gespeichert

Das heißt, wenn Sie versuchen, auf ein Hundertstel abzurunden, erhalten Sie 1156,11 statt 1156,12, was die "Besonderheit" ist, die Sie zum Grübeln gebracht hat.

 
Taras Slobodyanik:

das obige Beispiel mit der Zahl 1156,12, wird diese Zahl im Speicher als 1156,11999999999999891 gespeichert

Das heißt, wenn Sie versuchen, auf ein Hundertstel abzurunden, erhalten Sie 1156,11 statt 1156,12 - das ist die "Besonderheit" Ihres Problems.

Ja :-) Danke.