AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Nachkommastellen von Extended abschneiden um Integer zu erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Nachkommastellen von Extended abschneiden um Integer zu erhalten

Ein Thema von Kostas · begonnen am 26. Mai 2024 · letzter Beitrag vom 30. Mai 2024
Antwort Antwort
Seite 1 von 3  1 23      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 26. Mai 2024, 18:43
Delphi-Version: 5
Hallo Zusammen,

ich habe jetzt mit dem bekannten Problem von 0.1 bei Extended Zahlen zu kämpfen.

Zur Entwurfszeit steht der Cursor auf AIMINGRESULT und hat de Wert 24.1 * 10 sollte eigentlich 241 ergeben. Mit Trunc möchte ich danach den Extended in ein Integer umwandeln um die 241 als Integer in die DB zu schrieben. Doch aus 24.1 * 10 ergibt nicht 241 sondern 240.

Hat jemand eine Idee ich ich zuverlässig aus einem Extended mit 10 multiplizieren kann und danach evl. vorhandene Nachkommastellen abschneiden kann so dass ich einen Integer bekomme?
Miniaturansicht angehängter Grafiken
2024-05-26_182512.jpg   2024-05-26_182559.jpg  
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#2

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 26. Mai 2024, 19:12
Also bei mir ergibt 24.1 * 10.0 genau 241

Code:
var iDummy: Integer;

iDummy := (24.1 * 10.0);
Also müsstest du (AIMINGRESULT * 10.0).AsInterger in die Datenbank schreiben.
Debuggers don’t remove bugs, they only show them in slow-motion.

Geändert von DaCoda (26. Mai 2024 um 19:36 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 26. Mai 2024, 19:36
ja, bei mir auch wenn ich es so teste.

Die 24.1 werden aus mehreren Werten zusammen addiert und genau das führ zu diesem Seiteneffekt.
Es hängt damit zusammen wie Float Werte verarbeitet werden.

Code:
var a,b,c:extended;
begin
  inherited;
  a := 8.0;
  b := 8.4;
  c := a + b + 7.7;
  ShowMessage(Trunc(c * 10).ToString);


[Edit] ich könnte für meinen Fall anstelle von extended auch real verwenden. Dann würde zumindest dieser Fall funktionieren aber es muss doch eine zuverlässige Lösung dafür geben oder?

[Edit2]
Code:

var a,b,c,d,e:extended;
    i:integer;
begin
  inherited;
  a := 8.0;
  b := 8.4;
  c := 7.7;
  d := a + b + c;
  e := d * 10.0; // hier ist der Wert immer noch richtig e=241.
  i := Trunc(e); //Trunc schneidet nicht ab sondern Rundet oder konvertiert.
  ShowMessage(i.ToString);

Geändert von Kostas (26. Mai 2024 um 19:49 Uhr)
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 26. Mai 2024, 20:01
Bei mir geht das, wenn man das TRUC weg lässt:
Code:
var a,b,c:extended;
begin
  a := 8.0;
  b := 8.4;
  c := a + b + 7.7;
  ShowMessage((c * 10.0).ToString);    // <-- Ergibt bei mir 241;
end;
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 26. Mai 2024, 20:43
es könnten eben Nachkommastellen entstehen je nachdem was addiert wird. Ich benötige nach der Addition NUR die vor Kommastellen abgeschnitten nicht gerundet.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 00:42
Du schreibst du willst nicht runden. Darum kommst du nicht rum, wenn du mit trunc arbeitest. trunc rundet immer gegen 0: Wenn der in e:extended gespeicherte Wert zwar nahe einer integer Zahl i liegt, aber etwas unter i, dann liefert trunc(e) den Wert i-1 zurück.
Du schreibst weiter oben im Code // e := d * 10.0; // hier ist der Wert immer noch richtig e=241. - Das stimmt nicht; da "betrügt" dich die IDE.
Fall A: In e.frac ist nach e := d * 10.0;
1111000011111111111111111111111111111111111111111111111111 111111 gespeichert (gespeicherter Wert in e 240.höchstdarstellbare Nachkommazahl)
Fall B: Wohingegen nach e := 241; in e.frac
1111000100000000000000000000000000000000000000000000000000 000000
gespeichert ist - also genau 241.

Da trunc gegen 0 rundet, wird im Fall A 240 (11110000) ausgegeben, im Fall B 241 (11110001).

Es gibt diverse Möglichkeiten, das Problem zu lösen (und viele Beiträge dazu in DP).

Data.FmtBcd
Currency (Im "Mischbetrieb" mit extended und Co treten natürlich ähnliche Probleme auf)
Daran denken, dass extended unter Win32 genauer ist als unter Win64 (extended=double) und damit nicht die gleichen "Rundungsprobleme" aftreten.
setroundmode - Rundungsverhalten der FPU steuern - zum Beispiel: setroundmode( rmUp );
Michael Gasser

Geändert von Michael II (27. Mai 2024 um 12:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 10:59
Das gemeine darin ist auch, dass diese Problematik an unterschiedlichen Stellen im Zahlenraum auftritt, je nachdem ob man mit Single, Double oder Extended arbeitet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 13:21
Eine Möglichkeit wäre, in String zu konvertieren, nach dem Komma abscheiden und wieder ein Integer daraus machen, das das ist doch sicherlich nicht dir Lösung.
In diesem speziellen Fall kann ich zuverlässig sagen, ich habe zwei Stellen. Für die eine habe ich immer zuverlässig eine Nachkommastelle und für den anderen Fall haben ich zuverlässig immer nur zwei Nachkommastellen. Der Bereich geht von 0.0 bis 799.9 oder 0.0 bis 799.99
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.063 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 16:21
Hat jemand eine Idee ich ich zuverlässig aus einem Extended mit 10 multiplizieren kann und danach evl. vorhandene Nachkommastellen abschneiden kann so dass ich einen Integer bekomme?
Delphi-Quellcode:
So vielleicht?
var
   Value:Extended;
   IntValue:Integer;
Value:=24.1 * 10;
IntValue:=Trunc(Value+0.5);
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 16:25
Zitat:
+0.5
Bei 0.9 würde dann aber +1 rauskommen.

Trunc(1.9) = 1
Trunc(1.9+0.5) = 2


Aber ja, ein +0.00…001 und dann Trunc, wäre eine mögliche Lösung, allerdings nur, wenn es kleiner ist, als real vorkommende Nachkommastellen.
Oder vielleicht auch ein RoundTo mit einem passenden SetFPURoundMode.
Oder ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Mai 2024 um 16:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19: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