Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi zufällig erzeugte singles haben zu viele nachkommastellen. (https://www.delphipraxis.net/54605-zufaellig-erzeugte-singles-haben-zu-viele-nachkommastellen.html)

DGL-luke 7. Okt 2005 14:12


zufällig erzeugte singles haben zu viele nachkommastellen.
 
hi, folgender code:

Delphi-Quellcode:
random(5) + (random(100)/100)
//^ 0..5 ^   ^  0.00..0.99 ^
sollte mir werte von 0,01 bis 5,99 erzeugen. und zwar 0,010000 bis 5,990000. ich lade diese werte in ein array of single. rauskopmmen tut dann z.B.:


Code:
0,0299999993294477;
4,19999980926514;
1,66999995708466;
1,1599999666214;
1,41999995708466;
0,469999998807907;
0,839999973773956;
0,28999999165535;
4,3600001335144;
3,3199999332428;
warum? werden die nachkommastellen beim zuweisen nicht weiter beachtet, muss ich deshalb erst mal den kompletten speicherbereich des arrays nullen?

ist an meinem code was falsch?

vielen dank schon mal für die hilfe.

jim_raynor 7. Okt 2005 14:17

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
Eigenart von Computern, dass sie gleitkommazahlen nicht 100% genau darstellen können. Problem ist, dass die Nachkommazahlen eine gewisse Genauigkeit. Nutze am besten Funktionen wie FormatFloat und vergleiche Gleitkommazahlen nicht auf Gleichheit. Vermeide sie, wo es wirklich um Genauigkeit geht, denn

Delphi-Quellcode:
a := 1.0;
if a = 1 then
  ShowMessage('Test');
muss dir nicht unbedingt die Messagebox ausgegeben, auch wenn man es erwartet.

DGL-luke 7. Okt 2005 14:25

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
aha... mal sehen, was ich da machen kann.

dizzy 7. Okt 2005 15:44

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
Auch hierzu nochmal mein Beitrag den ich gerne in solchen Threads wie deinen verlinke, einfach zum Verständnis.

Gruss,
Fabian

BlackJack 8. Okt 2005 09:33

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
Zitat:

Zitat von DGL-luke
Delphi-Quellcode:
random(5) + (random(100)/100)
//^ 0..5 ^   ^  0.00..0.99 ^
sollte mir werte von 0,01 bis 5,99 erzeugen. und zwar 0,010000 bis 5,990000.

das stimmt nicht ganz, denn das Integer-Random() erzeugt werte 0 <= Random(x) < x !
oder auch 0 <= Random(x) <= x-1.
d.h. dass bei dem Integer-Random die angegebene Zahl nicht erreicht wird, und das ergebniss ist immer um eins kleiner als die angegebene zahl!

DGL-luke 8. Okt 2005 09:39

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
ja, hast recht. das ist mir aber im moment ziemlich egal, solange ich das kommastellenproblem habe ;)

himitsu 8. Okt 2005 10:30

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
Delphi-Quellcode:
random(600)/100  // 0 .. 5.99
Du kannst ja Currency verwenden, dat hat immer maximal 4 nachkommastellen und sollte bei denen 2 Stellen auch keine Rundungsfehler erzeugen. (ist ja intern auch ein scalierter Integer und kein echter Float)

Ansonten kannst du halt immer nur mit gerundeten Werten arbeiten und nicht mit direkten Verkgleichen.

DGL-luke 8. Okt 2005 10:35

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
danke. currency ist sicher eine gute möglichkeit. geht ja auch um geldbeträge....

EDIT: ja, das scheint gut zu gehen.

himitsu 8. Okt 2005 10:58

Re: zufällig erzeugte singles haben zu viele nachkommastelle
 
Zitat:

Zitat von DGL-luke
danke. currency ist sicher eine gute möglichkeit. geht ja auch um geldbeträge....

EDIT: ja, das scheint gut zu gehen.

Das ist natürlich so beabsichtigt, denn Currency wurde ja extra für derartige Dinge entwickelt.

Zitat:

Zitat von Die OH
Der Typ Currency ist ein Festkomma-Datentyp, der Rundungsfehler in finanzmathematischen Berechnungen minimiert. Er wird als skalierter 64-Bit-Integer gespeichert, bei dem die vier niedrigst wertigen Stellen implizit vier Nachkommastellen repräsentieren. Bei einer Kombination mit anderen reellen Typen in Zuweisungen und Ausdrücken werden Currency-Werte automatisch mit 10000 multipliziert.



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