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

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 2 von 2     12
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.686 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 16:32
Abgesehn davon, dass Extended "ursprünglich" nie dafür gedacht war von Entwicklern zur Speicherung genutzt zu werden,
weswegen es das anfangs in vielen anderen Sprachen (C++) garnicht gab, bzw. teilweise immernoch nicht gibt.

Merkt man jetzt, dass es in Bezug auf Win64 und Multiplatform (Android/iOS) wieder nicht mehr gibt.

Kann man von der Verwendung von Extended sowieso nur ausdrücklich von abraten.
Das würde aber hier keinen Unterschied machen, da dasselbe Problem auch mit Single oder Double auftritt.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 27. Mai 2024, 16:44
Das Problem ist hier eigentlich die Verwendung von Trunc statt Round bzw. RoundTo. Zur internen Darstellung einer Float-Zahl wird die nächstgelegene Zahl verwendet, die mit der aktuellen Auflösung darstellbar ist. In den Fällen, wo das nicht exakt machbar ist, kann die dargestellte Zahl kleiner oder größer als die gewünschte Zahl sein, je nachdem welche näher dran liegt. Bei einer kleineren Zahl liefert ein Trunc dann aber nicht das erwartete Ergebnis.

Leider gibt es kein Allheilmittel für dieses Problem, da es immer von der aktuellen Bedeutung der Zahl und deren Verwendung abhängt. Unter der Annahme, dass eine Genauigkeit von zwei Nachkommastellen ausreicht, kann man ein RoundTo auf die zwei Stellen machen und darauf dann das Trunc loslassen. Alternativ multipliziert man mit 1000, macht ein Round auf Integer mit anschließendem DIV 10. Es gibt viele Wege, aber für alle braucht es etwas Kontext.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Amateurprofi

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

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 28. Mai 2024, 16:57
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 ...
Recht hast Du.
Ausrede für Helden: Es ging um 24.1*10, nicht um 1.9.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 28. Mai 2024, 19:28
Die Werte die ich über RS232 bekommen sind Strings mit keiner, einer oder zwei Nachkommastellen. Nach dem Empfang werden die sie in einen Array of Record, da es noch weitere Daten pro Datensatz gibt. Das Feld für den Zahlenwert werde ich jetzt vom extended auf Real umstellen. Wie gesagt, die Einzelwerte die ich bekomme sind im Bereich von 0.0 bis 799.99 Maximal können 100 einzelne Werte zusammenaddiert werden. In die Datenbank muss ich dann eh ein Integer speichern. Die Auswertungen können jedoch ohne Nachkommastellen, mit einer oder zwei Nachkommastellen notwendig sein.

Vielen lieben Dank für die aktive Hilfe.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.961 Beiträge
 
Delphi 12 Athens
 
#5

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 28. Mai 2024, 19:39
Das Feld für den Zahlenwert werde ich jetzt vom extended auf Real umstellen.
[..]
In die Datenbank muss ich dann eh ein Integer speichern.
Wie schon geschrieben:
Warum bleibst du nicht einfach gleich bei Integer? Dann hast du doch keinerlei Probleme mehr damit.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
268 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 29. Mai 2024, 13:46
Oder Ceil oder Floor aus Math, da ist wenigstens klar, was sie machen. Es gibt im Übrigen auch RoundTo (nicht Round Two , vielleicht hilft das
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#7

AW: Nachkommastellen von Extended abschneiden um Integer zu erhalten

  Alt 30. Mai 2024, 12:27
Integer und mit einem zusätzlich einen Faktor ist wahrscheinlich die beste Lösung.
Genau das macht auch Currency (Faktor ist 1000).
Leider beherscht Delphi nicht von Haus aus Numeric(), dass arbeitet in Datenbanken genau wie Currency, aber man kann die Anzahl der Vor-und Nachkommastellen angeben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:30 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