AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Nachkommastellen abschneiden OHNE Runden ??
Thema durchsuchen
Ansicht
Themen-Optionen

Nachkommastellen abschneiden OHNE Runden ??

Ein Thema von bodenheim · begonnen am 28. Nov 2009 · letzter Beitrag vom 30. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#1

Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 16:04
Bin echt am Verzweifeln:

Ich habe einen Rechenwert (Float), z.B. 0.987, und jetzt will ich den Wert auf 2 Nachkommastellen einfach abschneiden,
also 0.98 ,ohne Runden.

Habe schon probiert mit FloattoStrF usw. aber der rundet immer.
Wie geht das richtig?
Danke!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 16:06
NeueZahl := trunc(Zahl * 100) / 100;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bodenheim

Registriert seit: 9. Mär 2008
73 Beiträge
 
#3

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 16:18
Zitat von DeddyH:
NeueZahl := trunc(Zahl * 100) / 100;
das klappt. Danke !!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 17:48
Zitat von bodenheim:
Zitat von DeddyH:
NeueZahl := trunc(Zahl * 100) / 100;
das klappt. Danke !!
...leider nicht, wenn man bereits mit vermeidlich auf zwei Stellen genauen Zahlen rumhantiert.
Beweis:
Delphi-Quellcode:
program FloatingPointTuecken;
{$APPTYPE CONSOLE}

uses
  SysUtils;

Var
  i : Integer;
  Beispiel,
  Abgerundet : Double;

  Function Abrunden (Zahl : Double) : Double;
  Begin
      Result := Trunc (Zahl * 100) / 100;
  End;

begin
  for i:=1 to maxint do begin
    Beispiel := i/100; // Klar, eine Zahlen auf 2 Stellen
    Abgerundet := Abrunden(Beispiel); // Sicherheitshalber abrunden
    if Abs (Beispiel - Abgerundet)>0.005 Then // Falls das nicht klappt, ...
      writeln(i,Beispiel,Abgerundet); // wundern!
  end;
end.

Abhilfe: Berücksichtigen der Rundungsfehler, indem wir 'fast aufrunden':
Delphi-Quellcode:
function KorrektesAbrunden(Zahl: Double): Double;
Const
  KorrekturDerSchutzStellen = 0.5 - 1E-16;

begin
  If Zahl < 0 then
    Result := Trunc(Zahl * 100 - KorrekturDerSchutzStellen) / 100
  Else
    Result := Trunc(Zahl * 100 + KorrekturDerSchutzStellen) / 100;
end;
Hier der komplette Testcode: Er testet alle Zahlen -maxint/100 .. +maxint/100;
Delphi-Quellcode:
program FloatingPointTuecken;
{$APPTYPE CONSOLE}
uses
  SysUtils;

type
  TAbrundenFunktion = function(Zahl: Double): Double;

function Abrunden(Zahl: Double): Double;
begin
  Result := Trunc(Zahl * 100) / 100;
end;

function KorrektesAbrunden(Zahl: Double): Double;
Const
  KorrekturDerSchutzStellen = 0.5 - 1E-16;

begin
  If Zahl < 0 then
    Result := Trunc(Zahl * 100 - KorrekturDerSchutzStellen) / 100
  Else
    Result := Trunc(Zahl * 100 + KorrekturDerSchutzStellen) / 100;
end;

function ZahlenUngleich(Zahl1, Zahl2: Double): Boolean;
begin
  Result := Abs(Zahl1 - Zahl2) > 0.005;
end;

procedure ZeigeFehler(Funktionsname : String; Zahl, Gerundet: Double);
begin
  Writeln('Die Funktion "',Funktionsname,'" funktioniert nicht korrekt.');
  Writeln('Beispiel:');
  Writeln(' Zahl : ', Zahl: 8: 2);
  Writeln(' Abgerundet : ', Gerundet: 8: 2);
  Writeln;
end;

procedure TesteKorrektesRundenMit(FunktionsName : String;
  EineAbrundenFunktion: TAbrundenFunktion);
var
  i: Integer;
  Beispiel,
    Abgerundet : Double;

begin
  for i := -maxint to maxint do begin
    Beispiel := i / 100;
    Abgerundet := EineAbrundenFunktion(Beispiel);
    if ZahlenUngleich(Beispiel, Abgerundet) then begin
      ZeigeFehler(Funktionsname, Beispiel, Abgerundet);
      Exit;
    end;
  end;
  Writeln('Die Funktion "',Funktionsname,'" funktioniert besser');
end;

begin
  TesteKorrektesRundenMit('Gängige Version', Abrunden);
  TesteKorrektesRundenMit('Korrigierte Version', KorrektesAbrunden);
  ReadLn;
end.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 17:51
Das passiert aber nur wenn "NeueZahl" keine Ganzzahl (Integer, Word, Byte etc.) ist oder?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 19:37
Zitat von SirThornberry:
Das passiert aber nur wenn "NeueZahl" keine Ganzzahl (Integer, Word, Byte etc.) ist oder?
"Nur" ist gut, denn es gibt ja viel viel mehr kaputte als ganze Zahlen.
Aber da ganze Zahlen als Floating Point exkat darstellbar sind, dürfte das ok sein.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 28. Nov 2009, 19:47
Zitat von alzaimar:
Aber da ganze Zahlen als Floating Point exkat darstellbar sind, dürfte das ok sein.
Solange sie in die Auflösung des jeweiligen Fließkommatypen reinpassen.

Ein Int64 (dessen Wertebereich) ist in einem Extended darstellbar, aber nicht in einem Single.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 29. Nov 2009, 04:09
Zitat von himitsu:
Zitat von alzaimar:
Aber da ganze Zahlen als Floating Point exkat darstellbar sind, dürfte das ok sein.
Solange sie in die Auflösung des jeweiligen Fließkommatypen reinpassen. Ein Int64 (dessen Wertebereich) ist in einem Extended darstellbar, aber nicht in einem Single.
[klugscheissmodus=an]
Ganze Zahlen sind ja nicht nur Integer, Int64 usw. Auch eine Zahl vom Typ Extended kann eine ganze Zahl sein, z.B. "1.0" Aber es ist ja klar, das wir "kaputte bzw. ganze Zahlen" im Kontext des Wertebereichs des Floating-Point Datentyps meinen.
[klugscheissmodus=aus]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 29. Nov 2009, 09:25
18.446.744.073.709.551.616 ist 'ne Ganzzahl und ein Single kann diese zufällig ganz genau darstellen.
18.446.744.073.709.551.615 ist auch eine Ganzzahl und paßt sogar in den Wertebereichs des Single, aber eben nicht ganz genau,
da für den Single quasi all diese Ganzzahlen 18.446.744.xxx.xxx.xxx.xxx das Selbe sind.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Nachkommastellen abschneiden OHNE Runden ??

  Alt 29. Nov 2009, 17:08
Du hast vergessen, den KS-Modus einzuschalten. Worauf willst du denn hinaus?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz