AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FloatToStrF Rundungsfehler ?

Ein Thema von egentur · begonnen am 28. Jan 2021 · letzter Beitrag vom 5. Feb 2021
Antwort Antwort
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: FloatToStrF Rundungsfehler ?

  Alt 1. Feb 2021, 13:48
Danke für die vielen Hinweise!

Meine Situation ist folgende:
Ich habe eine Messgerät das den Wert immer mit 5 Nachkommastellen als String liefert. z.B. '0,50015'

Dieser wert wir dann für eine Nebenrechnung mit val() in eine Double Variable konvertiert.


Der User kann dann in der Applikation einstellen, ob er den Wert mit 5 oder weniger Nachkommastellen sehen will.

Mein Problem war eben, wenn er 4 Nachkommastellen einstellt,
wird aus der Double Var mit Floattostrf(var, fffixed,6,4) einmal 0,5002 und einmal 0,5001.

Welche Bedingung bringt Floattostrf dazu an der gleichen Codestelle zwei verschiedene Ergebnisse zu liefern ?
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
233 Beiträge
 
#2

AW: FloatToStrF Rundungsfehler ?

  Alt 2. Feb 2021, 11:01
Das Problem hast du mit anderen Zahlen auch bei 2 oder 3 Nachkommastellen.
Ist dir vielleicht nur noch nicht aufgefallen.
Einzig bei 1 Nachkommastelle hättest du das Problem nicht, da es da nur X,5 gibt,
welches in Double (und Float und Extended und whatever) unproblematisch ist.

Du brauchst halt eine generelle Lösung für das Problem und da hilft es dir nur
zu verstehen, warum das passiert. Was du am Ende im Quelltext schreiben musst,
kann dir so vermutlich keiner sagen.

Erst-Bester-Versuch: Addiere ein kleines Diff auf die Zahl drauf.
Wenn du als String immer 5 Nachkommastellen bekommst, dann rechne 1 auf die sechste Nachkommastelle.
z.B. 0,50015 + 0,000001 = 0,500151 ... wenn der Computer
0,500149999999999 davon macht würde er mit 0,50015099999999 arbeiten ...
wenn man den Wert rundet (durch die Anzeige) dann kommt das "richtige" bei rum.
Auch für das Abrunden wäre das unproblematisch, da dir der String ja immer 5 Nachkommastellen liefert.
auch bei 0,50014 wird 0,500141 daraus, welches genauso abgerundet wird wie der "echte" Wert.

[Edit:] Aso, um deine Frage zu beantworten. Alleine durch lustiges Konvertieren oder umspeichern

Delphi-Quellcode:
DerWert := StrToFloatDef(WertAusSensor(), 0); // <- Hier kommt "0,50015"
ShowMessage(FloatToStrF(DerWert, ffFixed, 6, 4));
... ist schon was anderes als ...

ShowMessage(FloatToStr(0.50015, ffFixed, 6, 4));
Liebe Grüße
Incocnito

Geändert von Incocnito ( 2. Feb 2021 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#3

AW: FloatToStrF Rundungsfehler ?

  Alt 3. Feb 2021, 22:31
... Meine Situation ist folgende: Ich habe eine Messgerät das den Wert immer mit 5 Nachkommastellen als String liefert. z.B. '0,50015'
Dieser wert wir dann für eine Nebenrechnung mit val() in eine Double Variable konvertiert.
Der User kann dann in der Applikation einstellen, ob er den Wert mit 5 oder weniger Nachkommastellen sehen will.
Mein Problem war eben, wenn er 4 Nachkommastellen einstellt,
wird aus der Double Var mit Floattostrf(var, fffixed,6,4) einmal 0,5002 und einmal 0,5001.
Welche Bedingung bringt Floattostrf dazu an der gleichen Codestelle zwei verschiedene Ergebnisse zu liefern ?
Hallo Egentur,
ich kann Dein ursprüngliches Problem nicht reproduzieren: Bei mir (XE5 Pro) funktioniert FloatToStrF (..) korrekt. Vielleicht ist noch ein Bug in XE2? Daher habe ich für Dich einige Routinen für die manuelle Rundung als Ersatz von FloatToStrF(..) im beiliegenden Testprogramm zusammengestellt.
Gruß, Andreas
Angehängte Dateien
Dateityp: zip FloatToStrF_Rundungsfehler.zip (59,2 KB, 7x aufgerufen)
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
736 Beiträge
 
Delphi 12 Athens
 
#4

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 07:05
Das Problem war ja nicht FloatToStrF, sondern die Tatsache, dass 0.50015 in einem double zu 0.50014999999 wird und dann auf 4 Stellen gerundet 0.5001. Die Funktion, mit der gerundet wird, spielt dabei keine Rolle,

Ändere mal in deinem Beispiel den Typ von "Zahl" zu double. Dann sieht man das schön.
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 11:09
Hallo bvcs

Mein Problem war schon floattostrf

Selbst wenn ich den Wert der Double Variablen explizit auf 0.500149999999999983 setze ( was ja dann bei floattostrf(var,fffixed,6,4) 0.5001 ergeben müsste

habe ich bei den Aufrufen immer das Ergebnis 0.5002

Erst nach einem Ausdruck egibt es dann 0.5001 und bleibt auch so, bis zu einem erneuten Prgogrammstart.

Welche Randbedingungen ( Luftdruck, Zimmertemperatur ) führen denn dazu, das floattostrf bei zwei identischen ( an gleicher Stelle) Aufrufen
eine unterschiedliches Ergebnis liefert ?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#6

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 11:38
Kann das Problem also im Quickreport sein und nicht in der Funktion?
Darüber schon mal nachgedacht/geforscht?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
233 Beiträge
 
#7

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 15:35
Klingt als würde da ein Modul eine globale Einstellung ändern ...
TFormatSettings oder sowas.

Hilft denn mein Tipp nicht, um zuverlässig immer das gleiche Ergebnis zu erhalten?

LG Incocnito
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: FloatToStrF Rundungsfehler ?

  Alt 4. Feb 2021, 16:00
Hallo Incocnito

Doch , danke

Ich werde da die Messwerte immer als string mit 5 Nachkommastellen geliefert werden
nach der Konvertierung in double 0.000001 addieren
dann futionierts auch mit floattostrf(x,fffixed,6,4)

Ich musste das so machen weil der User die Nachkommastellen in seinem Grid/Report individuell einstellen wollte.


aber denoch würde ich gerne den Grund wissen !!
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:35 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