Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SimpleRoundTo: Unterschied D2006 und D2010?? (https://www.delphipraxis.net/150620-simpleroundto-unterschied-d2006-und-d2010.html)

Ralf Kaiser 22. Apr 2010 07:13


SimpleRoundTo: Unterschied D2006 und D2010??
 
Halli Hallo,

bei einer Berechnung ist mir folgendes aufgefallen:

Ich will einen Wert auf 2 Stellen runden und dabei nicht kaufmännisch nach "Bankers Rounding"-Regeln runden, sondern "ganz normal".

In Delphi 2010 funktioniert "SimpleRoundTo" genau so wie ich es mir vorstelle. Beispiele bei denen auf 2 Stellen gerundet wird:

88.115 => 88.12
88.665 => 88.67

Lasse ich die selben Rundungen nun mit Delphi 2006 durchführen dann erhalte ich diese Ergebnisse:

88.115 => 88.11
88.665 => 88.67

Ist das jetzt ein (eventuell bekannter) Bug in D2006? (Das wäre nicht so gut, da wir hier noch nicht alles auf D2010 umgestellt haben)

EDIT: der Rundungsmodus ist in beiden Delphi-Versionen per Voreinstellung "rmNearest"


Danke schon mal,
Ralf

Peter1999 22. Apr 2010 08:52

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
Das ist wohl so.

Deshalb wurde wohl auch von Double (<= D2007) auf Extended (ab D2009) umgestellt.

Viele Grüße,
Peter

Billa 22. Apr 2010 08:52

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
Ob es zwischen den Verdsionen tatsächlich einen Unterschied gibt, weiß ich nicht.
Aber man kann ja mit einer eigenen Funktion das gewünschte Verhalten erzwingen.
Beispiel auf 2 Nachkommastellen

- Multipliziere mit 100
- Addiere 0.5
- Teile den ganzzahligen Anteil durch 100

Analog wird bei drei Nachkommastellen mit 1000 multipliziert bzw. dividiert ...
hth


Habe vor Urzeiten mal bei Delphi 5 was in der Richtung gelesen und verwende seitdem
die eigene Funktion, es sei denn es geht um kaufmännische Sachen ....

himitsu 22. Apr 2010 08:54

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
Zitat:

Zitat von Billa
es sei denn es geht um kaufmännische Sachen ....

Da verwendet man eh vorwiegend den Typ Currency, welcher Aufgrund seiner Intergereigenschaften für sowas besser geeignet ist.

Peter1999 22. Apr 2010 08:57

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
@Billa

Sieh dir mal die Quelltexte von SimpleRoundTo an.
Die machen genau das, was du da beschreibst.

Das Problem ist aber eher, was Himi sagt. Die Genauigkeit des Double ist einfach nicht ausreichend. Daher: Extended

Ralf Kaiser 22. Apr 2010 09:10

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
Zitat:

Zitat von Peter1999
@Billa

Sieh dir mal die Quelltexte von SimpleRoundTo an.
Die machen genau das, was du da beschreibst.

Das Problem ist aber eher, was Himi sagt. Die Genauigkeit des Double ist einfach nicht ausreichend. Daher: Extended

Hab ich mittlerweile gemacht. Ich verwende jetzt nicht mehr SimpleRoundTo sondern den "Inhalt" von SimpleRoundTo den ich in eine eigene Routine kopiert habe. So erhalte ich mit D2006 und D2010 die selben Ergebnisse (nur noch nötig, bis hier D2010 endlich "offiziell" wird...)

Ciao,
Ralf

Billa 22. Apr 2010 09:19

Re: SimpleRoundTo: Unterschied D2006 und D2010??
 
Ok, den Datentyp hatte ich nicht berücksichtigt. Vielleicht war es ja in Wirklichkeit 88.114999999.
Da kann eine Umwandlung in String helfen "nicht sichtbare" Nachkommaanteile verschwinden zu lassen.
Bestimmt nicht schnell oder elegant, aber recht zuverlässig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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