AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Ich dreh durch! wie kann das sein - Problem beim Runden.
Thema durchsuchen
Ansicht
Themen-Optionen

Ich dreh durch! wie kann das sein - Problem beim Runden.

Ein Thema von Cyberstorm · begonnen am 29. Jun 2007 · letzter Beitrag vom 29. Jun 2007
Antwort Antwort
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#1

Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:19
bei folgendem code kommt bei mir einmal 1.14 raus (obwohl 1.13 rauskommen soll) und bei der direkten variante 1.13 obwohl s1 und s2 beide male 2.26 ist und das der gleiche verdammte aufruf ist *Grml*.
bei allen anderen zahlen die ich damit so runde hat das super geklappt nur bei dieser konstellation nicht :-/. wenn man z.b. a[5] durch 0.82 und dafür a[6] durch .021 ersetzt klappts wieder?
ich dreh durch...

Delphi-Quellcode:
uses math;

procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2: double;
  i: Integer;
  a: array[0..6] of double;
begin
  s1:=0;
  s2:=2.26;
  a[0]:=0.20;
  a[1]:=0.27;
  a[2]:=0.22;
  a[3]:=0.27;
  a[4]:=0.27;
  a[5]:=0.81;
  a[6]:=0.22;
  for i:=0 to 6 do
  s1:=s1 + a[i];
  ShowMessage(FloatToStr(ceil((s1/2)*100)/100));
  Showmessage(FloatToStr(ceil((s2/2)*100)/100));
end;
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:36
Ob ceil die richtige Funktion zum runden ist??
Warum nimmst du nicht round?
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#3

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:44
weil round nicht immer aufrundet (was ich will).
ceil schon.

Tritt bei euch diese Merkwürdigkeit denn auch auf????
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:51


Eigentlich sollte man nicht schon bei drei Stellen an die Grenzen der Double-Genauigkeit stoßen.

Hm. Hast du das selbe Problem wenn du Single oder Float(=Extended) verwendest?

Wenn du nicht mehr als zwei Nachkommastellen brauchst, kannst du Currency verwenden. der hat fixed-point decimals, ist also unbegrenzt genau auf drei stellen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 16:57
Also, wenn man diese Zahlen da addiert und dann durch 2 teilt, kommt 1,13 raus. Wenn du das jetzt mal hundert nimmst, bist du bei 113. Wenn jetzt aufgrund der Ungenauigkeit 113,0000000001 da stünde, würde ceil doch korrekterweise auf 114 aufrunden, oder?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#6

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 17:04
Zitat von DGL-luke:


Eigentlich sollte man nicht schon bei drei Stellen an die Grenzen der Double-Genauigkeit stoßen.

Hm. Hast du das selbe Problem wenn du Single oder Float(=Extended) verwendest?

Wenn du nicht mehr als zwei Nachkommastellen brauchst, kannst du Currency verwenden. der hat fixed-point decimals, ist also unbegrenzt genau auf drei stellen.
Danke! meine Rettung . Mit Currency funzt es wunderbar.


Zitat von OregonGhost:
Also, wenn man diese Zahlen da addiert und dann durch 2 teilt, kommt 1,13 raus. Wenn du das jetzt mal hundert nimmst, bist du bei 113. Wenn jetzt aufgrund der Ungenauigkeit 113,0000000001 da stünde, würde ceil doch korrekterweise auf 114 aufrunden, oder?
super erklärung, nu hats geklingelt

Danke Leute.
Und ein nachträglich "Hallo" erstmal.
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
110 Beiträge
 
Delphi 12 Athens
 
#7

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 17:14
Zitat von Cyberstorm:
bei folgendem code kommt bei mir einmal 1.14 raus (obwohl 1.13 rauskommen soll) und bei der direkten variante 1.13 obwohl s1 und s2 beide male 2.26 ist und das der gleiche verdammte aufruf ist *Grml*.
bei allen anderen zahlen die ich damit so runde hat das super geklappt nur bei dieser konstellation nicht :-/. wenn man z.b. a[5] durch 0.82 und dafür a[6] durch .021 ersetzt klappts wieder?
ich dreh durch...

Delphi-Quellcode:
var
  s1, s2: double;
  i: Integer;
Computer können nicht genau rechnen
Im Ernst: Statt dem von uns Menschen bevorzugten Zehnersystem rechnet der Computer ja im Binärsystem. Zahlen wie 2.26 oder 1.13 können in den Gleitkommatypen wie Single, Double, Extended nicht exakt abgebildet werden:
0.5 = 2 hoch -1 = 1/2
0.25 = 2 hoch -2 = 1/4
0.125 = 2 hoch -3 = 1/8
usw.

Versuche mal, 0.3 als Summe von Zweierpotenzen abzubilden:
0.3 = 1/4 + 1/32 + 1/64 + 1/256 = 0.30078125

Ein Dezimalbruch wie 0.3 kann nur näherungsweise im Binärsystem gespeichert werden, denn dort ist es eine Zahl mit vielen Nachkommastellen, u.U. unendlich periodisch. Durch die begrenzte Länge der Datentypen wird diese Folge von Nachkommastellen irgendwo abgeschnitten; die Zahl ist ungenau. Wenn Du nun diese ungenauen Zahlen addierst, dann addierst Du auch die Fehler.

Für Deine Aufgabe ist daher ein geeigneter Datentyp erforderlich; bei Geldbeträgen bis 4 Nachkommastellen ist "Currency" die richtige Wahl.

Weitere Infos:
http://de.wikipedia.org/wiki/Rechengenauigkeit
Achim
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 19:02
Ach Leute, einfach mit Double oder Extended rechnen (wobei Double eigentlich immer reicht). Dann das Ergebnis auf die gewünschte Genauigkeit runden, und zwar mit 'RoundTo'.

Bei den Float-Datentypen einfach immer im Hinterkopf haben, das man nicht auf Gleichheit prüfen kann. Um eine Zahl mit einer anderen auf Gleichheit zu prüfen, bildet man die Differenz und prüft, ob das Ergebnis < irgendein Grenzwert ist. Die Math-Unit stellt dafür einige Funktionen bereit: 'IsZero', 'SameValue' und 'CompareValue'.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#9

Re: Ich dreh durch! wie kann das sein - Problem beim Runden.

  Alt 29. Jun 2007, 19:03
Ja, danke auch an Dich nochmal für die Erklärung kalwados!
Leuchtet ein.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:35 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