AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Teilen

Ein Thema von TimoB · begonnen am 1. Okt 2008 · letzter Beitrag vom 2. Okt 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Hilfe

  Alt 1. Okt 2008, 21:54
Hallo TimoB, gib deinem Beitrag bitte einen aussagekräftigen Titel entsprechend den Forenregeln
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
TimoB

Registriert seit: 7. Sep 2008
Ort: Schiffdorf
7 Beiträge
 
#12

Re: Teilen

  Alt 1. Okt 2008, 22:29
sorry wegen derm themenbezeichnung.
das round (zahl - 0,5) kann mir auch nicht weiterhelfen. z.b. 0,99999955 -0,5 = 0,49999955 und damit auch 0
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Teilen

  Alt 1. Okt 2008, 22:46
der neue Titel ist ja auch nicht gerade grob das Problem beschreibend Aber wenigstens war der Wille vorhanden?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#14

Re: Teilen

  Alt 1. Okt 2008, 23:08
Ich begreife nicht ganz, was hier so schwer fällt.
Und insbesondere nicht, warum du es nicht mit Format() versuchst!

Also, hier mal ein Beispiel
Delphi-Quellcode:
label1.caption:=floattostr(3.7/3.7); // label zeigt 1
 label2.caption:=floattostr(3.7/3.70101010); // label zeigt 0,9997270....
 label3.Caption:=format('%2.0f',[3.7/3.70101010]) // label zeigt 1
Abgesehen davon, dass 3.7 / 3.7 tatsächlich 1 ergibt, kann mit Format() dein Rundungsproblem gelöst werden

Korrekter, als den Rundungsfehler am Ende zu korrigieren, wäre es, die Berechnung schrittweise durchzugehen und die Zwischenergebnisse zu überprüfen. Vielleicht muss ja ein krummer Wert 'rauskommen, vielleicht aber auch nicht.

Gute Nacht für Heute
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#15

Re: Hilfe

  Alt 1. Okt 2008, 23:12
Zitat von Phoenix:
Auf ganze Zahl abrunden: Round(Zahl - 0.5);
Was dann wieder trunc entspricht.

@Topic:

IMHO liegt das ganze an der Ungenauigkeit der Gleitkommazahlen. Wenn sich 3,7 mit dem Datentyp nicht genau darstellen lassen, kommt eben auch nicht 1 heraus.

2 mögliche Lösungen:
  • Nimm eine andere Einheit z.B. Millimeter und rechne mit Ganzzahlen.
  • Addiere vor dem Abrunden einen Toleranzwert (1 mm oder weniger [einfach mal probieren]).
Evtl. könnte es bei Lösung zwei auch nützlich sein, einen anderen Datentypen mit höherer Genauigkeit, z.B. Double oder Currency zu wählen, wenn der Toleranzwert möglichst klein sein soll.

[edit]Aber taaktaaks Lösung ist einfacher und vermutlich die passende für dein Problem.,gibt aber im manchen Fällen, z.B. 2.25, Kommazahlen aus, nicht wie sinnvollerweise gefordert, Ganzahlen.[/edit]

MfG,
Bug
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Teilen

  Alt 2. Okt 2008, 01:02
Zitat von taaktaak:
label1.caption:=floattostr(3.7/3.7); // label zeigt 1
Ich gehe stark davon aus, dass der Compiler die Literale bereits zur Compiletime optimiert, und zusätzlich rechnet der TE noch zuvor mit seinen Werten herum. Er hat ja nicht 3.7 als Literal im Code, und auch keine Variablen denen er beiden je direkt diesen Wert zuweist, sondern es ist ein Ergebnis einer Rechnung, und diese kann durch die Funktionsweise von Floats bereits ungenau sein, und dies zieht sich dann eben durch.
Das ist einfach nur wieder ein Fall von "kenne deine Typen, und wisse um ihre Schwächen" . Wenn es auf hundertprozentige Genauigkeit ankommt, kommst du um Ganzzahltypen nicht herum. Man büßt dafür allerdings die maximale Anzahl der Nachkommastellen ein, und handelt sich sobald mehr als nur Addieren/Subtrahieren vor kommt erneut Fehler durch die nötige Rundung ein.
Manchmal ist es aber auch schon genug, die Rechnungen umzustellen, anders zu klammern, und generell Operatoren zu minimieren. Ob und wo das reicht ist aber von Fall zu Fall sehr unterschiedlich.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:40 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