Autor Beitrag
HeftCD
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 91
Erhaltene Danke: 9

Win2k, WinXP, Win7, Win8
Delphi 3 Pro, Delphi 5, Delphi 7, Turbo Delphi, BC1
BeitragVerfasst: Mo 18.06.07 23:14 
ich möchte gerne durch gebrochne Zahlen dividieren.

Bsp: 56654 / 35.456
= 1597,86

Ist der Algo so richtig?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function real_teilen(valueue1: real; value2: real): real;
var x, y, z: real;
begin
  x := value / value2;
  y := x * 100;
  z := int(trunc(y));
  z := z / 100;
  result := z;
end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: Mo 18.06.07 23:26 
Hi

gehts Dir um kaufmännische Rundung?

Gruß

Aga
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 18.06.07 23:28 
Moin!

user profile iconHeftCD hat folgendes geschrieben:
ich möchte gerne durch gebrochne Zahlen dividieren.
[...]
Ist der Algo so richtig?
[...]
ausblenden Delphi-Quelltext
1:
x := value / value2;					

Ja, der "Algo" ist soweit richtig... :rofl:

Der Rest hat nix mit dem Teilen zu tun, ist aber dafür viel zu umständlich... :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: Mo 18.06.07 23:30 
lach nicht Narses, meine Frage war nicht unbegründet

Gruß

Aga

//hier gucken
kmrd ist die ultimative Rundungsformel.
Alzaimar hat zwar gesagt, man müsse 0.5000001 in speziellen Fällen nehmen, aber habs heute mal bei mir getestet, bei mir hat er auch mit 0.5 richtig gerundet, vielleicht hat Alzaimar ja kein Intel Inside *duck und weg...aber natürlich bin ich ihm für den Hinweis dankbar...weil bei sonem *sch....kann man sich nen Wolf suchen
HeftCD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 91
Erhaltene Danke: 9

Win2k, WinXP, Win7, Win8
Delphi 3 Pro, Delphi 5, Delphi 7, Turbo Delphi, BC1
BeitragVerfasst: Mo 18.06.07 23:45 
achso, nee, kaufmännisch muß nicht unbedingt sein.

hatte das gerade nur auf 2 stellen wegen der Übersichtlichkeit gerundet

56654 / 35.456
1597,8677797833935018050541516245


das muß einfach nur möglichst genau sein.

also 6-7 Stellen hinter dem Komma sollten schon stimmen
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: Mo 18.06.07 23:52 
uhps, hab den link vergesseni

www.delphi-forum.de/...oblemquot_73306.html
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 19.06.07 08:21 
user profile iconAgawain hat folgendes geschrieben:
l
//hier gucken
kmrd ist die ultimative Rundungsformel.
Alzaimar hat zwar gesagt, man müsse 0.5000001 in speziellen Fällen nehmen, aber habs heute mal bei mir getestet, bei mir hat er auch mit 0.5 richtig gerundet, vielleicht hat Alzaimar ja kein Intel Inside *duck und weg...aber natürlich bin ich ihm für den Hinweis dankbar...weil bei sonem *sch....kann man sich nen Wolf suchen

Ich verwende 0.5 seit 25 Jahren oder noch länger 8) und habe die 0.50000001-Sch**** erst vor 3 Wochen zum ersten Mal erlebt. Ich hab meinen Augen nicht getraut. Da es um Kohle (Cent-Beträge) geht, habe ich dann die 0.500001-Krücke implementiert. Der Fehler tritt dann auf, wenn man z.B. MwSt-Beträge (gebrochen rational!) per Floating-Point addiert. Ein Ergebnis ist dann augenscheinlich 1234.55, aber in Wirklichkeit vermutlich sowas wie 1234.54999999999999999999999994. Irgendwie so. Er müsste also eigentlich nach oben runden, tut es aber nicht, weil das Ergebnis eben so 'krumm' ist.

Nicht umsonst gibt es den Currency-Datentyp, der damit locker fertig wird. Ob der aber auch in einer Addition korrekt rundet, muss ich mal testen.

_________________
Na denn, dann. Bis dann, denn.
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Di 19.06.07 09:47 
Hi
Nun, wenn's nicht um's abrunden geht, warum nicht einfach nur

Result:=x/y;

??? oder hab ich da was falsch verstanden ?
Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 19.06.07 09:51 
Wenns nur ums Rechnen geht, dann reicht x/y, ist doch klar.

_________________
Na denn, dann. Bis dann, denn.
r2c2
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 324
Erhaltene Danke: 2

Linux

BeitragVerfasst: Di 19.06.07 13:24 
Mal kurz zur Erklärung, warums zu "Rundungsfehlern" kommt:
Nach IEEE was-weiß-ich-wie-viel sind Foats folgendermaßen aufgebaut:
[Vorzeichen][Exponent][Mantisse]
Da es sich hier jeweils um Dualzahlen handelt, lassen sich malnche Zahlen nicht genau darstellen(0,4 z.B. Dezimal ist dieser Wert nicht periodisch. Binär hingegen schon).
Zusätzlich bietet die FPU mehrere Rundungsmodi(abrunden, aufrunden, RoundToNeartestEven und Trunc mein ich). RoundToNeartestEven entspricht am ehesten dem kaufmännischen Runden(aber nicht ganz). So wird 0,5 abgerundet, 1,5 aber aufgerundet. Zur nächsten Geraden Zahl hin eben.

Currency macht es hier einfacher. AFAIR ist das eine Implementierung von BCD-Zahlen(d.h. es wird intern nicht binär, sondern dezimal gerechnet(ICh nehm an das emuliert Delphi, k.a. hab momentan kein Delphi zur Hand und kann nicht nachgucken). Die Rundungsprobleme sollten hier also nicht auftreten...)

(Wenn ich mal entsprechend Zeit dazu hab, werd ich das vllt nochmal genauer untersuchen...)

Will man also unbedingt kaufmännisch runden, sollte man entweder Currency nehmen oder das Runden selbst in die Hand nahmen...

mfg

Christian

_________________
Kaum macht man's richtig, schon klappts!