![]() |
Re: Problem mit RoundTo((100*0.01),0)
Zitat:
In anderen Programmiersprachen gibt es dieses Problem sicher auch. Für die richtige Verwendung von Double ist der Programmierer zuständig. |
Re: Problem mit RoundTo((100*0.01),0)
@RavenIV
ok nocheinmal etwas deutlicher: Weil es hier um pure Codegear funktionen geht. Es geht hier nicht um den von uns geschriebenen Sourcecode. Anders formuliert tritt das problem INNERHALB der codegear math.RoundTo Funktion auf:
Delphi-Quellcode:
"Round(AValue / LFactor) * LFactor;" liefert hier unterschiedlich Ergebnisse.
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
var LFactor: Double; begin LFactor := IntPower(10, ADigit); Result := Round(AValue / LFactor) * LFactor; end; Wenn im besagten Fall für AValue von Aussen "100.0" oder "Staedte:Double=100.0" übergeben wird, so ist das Ergebnis für das Beispiel weiteroben unterschiedlich, was natürlich fatal ist! |
Re: Problem mit RoundTo((100*0.01),0)
Immer das selbe mit den Floats. Es gehört mMn zu den absoluten Grundlagen zu wissen, wie son ein Ding intern ausschaut, und was die Grenzen und Implikationen davon sind. Wenn ich aber etwas verwende, wovon ich gerade mal weiss, dass es das gibt, dann darf ich mich auch nicht wundern, wenn damit Probleme auftreten.
Es ist imho nicht an CodeGear Programmierer über die Bedingungen bei Floats aufzuklären, oder Nichtwissen abzufedern, sondern die Pflicht des Programmieres sich mit den Dingen genau auseinanderzusetzen, die er verwendet. Und dass Floats Ungenaugkeiten nach sich ziehen dürfte hunderttausendfach im Netz dokumentiert sein, allein in der DP sicher schon zigfach. So eine bahnbrechende "Entdeckung" fand hier also ganicht statt ;) |
Re: Problem mit RoundTo((100*0.01),0)
:hi:
Da bin ich doch etwas überrascht, was ich hier losgetreten habe ;) Nun, es ist egal, was ich verwende (Double,Extended,Real), es kommt trotzdem jedes Mal das Falsche raus. Auch das Workaround von peschai hat nicht das Richtige geliefert (oder ich habe nicht recht verstanden was genau getan wurde, gut möglich). Ich mache es jetzt so, dass ich *1/100 mache, anstatt *0.01. Das liefert das richtige Ergebnis. Ist ein halbes Jahr her, dass ich Delphi laufen hatte, demnach bin ich also nur Gelegenheits-Noob Programmierer ;) Ich werde mich also nicht für ein kleines Tool zum Privatgebrauch über die einzelnen Typen informieren. Zeitlich eh nicht möglich. Da es ja nun klappt, soll es für mich damit geklärt sein. Komisch ist es trotzdem. Aber das überlasse ich mal geschmeidig den Profis hier :mrgreen: Danke alle :thumb: |
Re: Problem mit RoundTo((100*0.01),0)
Hallo Leute,
Das hier beschriebene Problem scheint immer wieder mit den bekannten Unzulänglichkeiten von Gleitkommazahlen (neudeutsch floats) verwechselt zu werden. Hier geht es um etwas anderes. Obwohl zweimal die selbe gleitkommazahl als deselben typ übergeben wurde, ist das ergebnis anders. und das darf nicht sein. Die Ergebnisse dürfen hier falsch (gleitkomma unzulänglichkeiten) sein :-) aber nicht unterschiedlich (issue um was es geht)! Codegear hat dies ebenfalls erkannt. Bin über die fixe Fehlerbehebung seitens CodeGear positiv überrascht. "Issue" wurde dort erkannt und innerhalb eines Tages behoben. Wenn ich mir allerdings die Versionsnummer anschaue, muss ich wohl die nächste Delphi-Version dafür erstehen .... ? Zitat:
|
Re: Problem mit RoundTo((100*0.01),0)
Der Witz ist allerdings irgendwie, dass mein Delphi 7 mit Single, Real (=Double) und Extended bei allen 3 Vatianten genau das richtige Ergebnis liefert. :gruebel:
|
Re: Problem mit RoundTo((100*0.01),0)
@Medium
Hast du vorher "SetRoundMode(rmTruncate);" gesetzt ? |
Re: Problem mit RoundTo((100*0.01),0)
Zitat:
Zuerst kommt 1 dann 0 raus. MfG xZise |
Re: Problem mit RoundTo((100*0.01),0)
Zitat:
|
Re: Problem mit RoundTo((100*0.01),0)
Also mit Version 7.0 (Built 4.453) habe ich auch eine Anzeige von
100 , 1 , 1
Delphi-Quellcode:
Edit: hab (auch) SetRoundMode(rmTruncate) nicht gesetzt. Dann erhalte ich auch 100,1,0
uses math;
procedure TForm1.Button1Click(Sender: TObject); var p7,staedte : real; begin staedte := 100; p7 := RoundTo((staedte*0.01),0); showmessage(floattostr(staedte)); showmessage(floattostr(RoundTo((100*0.01),0))); showmessage(floattostr(p7)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz