2009-09-09 4 views
5

schauen Sie den folgenden Code, warum das Ergebnis der Trunc-Funktion ist anders?Trunc() Funktion

procedure TForm1.Button1Click(Sender: TObject); 
var 
    D: Double; 
    E: Extended; 
    I: Int64; 
begin 
    D := Frac(101/100) * 100; 
    E := Frac(101/100) * 100; 
    I := Trunc(D); 
    ShowMessage('Trunc(Double): ' + IntToStr(I)); // Trunc(Double): 1 
    I := Trunc(E); 
    ShowMessage('Trunc(Extended): ' + IntToStr(I)); // Trunc(Extended): 0 
end; 

Antwort

9

Formatierungsfunktionen nicht angezeigt immer die tatsächlichen Zahlen (Daten).
Reale Zahlen und Genauigkeit können schwierig sein.

Schauen Sie sich diesen Code, wo ich mehr Präzision verwenden, was ich auf dem Bildschirm sehen möchten:

D := Frac(101/100); 
    E := Frac(101/100); 
    ShowMessage(FloatToStrF(D, ffFixed, 15, 20)); 
    ShowMessage(FloatToStrF(E, ffFixed, 18, 20)); 

Es scheint, dass D so etwas wie 0.010000000000 ist während E wie 0.00999999999 ist.

Bearbeiten:Extended Typ hat eine bessere Präzision als Double Typ. Wenn wir versuchen, die Werte von D und E mit FloatToString() anzuzeigen, erhalten wir wahrscheinlich das gleiche Ergebnis, , obwohl die tatsächlichen Werte nicht die gleichen sind.

6

Hinweis Nick Ds Antwort. Er hat recht, wenn ich sage, dass

Es scheint, dass D so etwas wie ,010000000000 ist, während E wie ,00999999999 ist.

Die Antwort ist jedoch nicht in Formatierungsfunktion. So werden die Float-Berechnungen durchgeführt. Computer verstehen Float-Zahlen einfach nicht (da es unendlich viele Zahlen zwischen 0 und 1 gibt, während Computer mit einer endlichen Anzahl von Bits und Bytes arbeiten), und jede Double- oder Extended-Variable in Delphi (und den meisten anderen Sprachen) ist nur eine Annäherung (mit einigen wirklich seltenen Ausnahmen).

Sie können mehr davon auf Wikipedia lesen: Floating point und Fixed-point

+0

smok1, wir oft Float-Zahlen ohne die richtige Formatierung Parameter untersuchen und wir gehen davon aus, dass wir die wirklichen Werte erhalten. Das ist natürlich falsch, denn wie Sie richtig erwähnt haben, sind die Gleitkommazahlen eine Annäherung an die tatsächlichen Zahlen. +1 –

+1

+1 für die Erklärung, dass Computer Gleitkommazahlen als Näherung speichern –

+2

Nicht jede Gleitkommazahl ist eine Annäherung. Negative Zweierpotenzen und deren Summen (zB 0,5) werden ohne Approximation dargestellt. – gabr

Verwandte Themen