Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Nur x Nachkommastellen von Float (https://www.delphipraxis.net/213829-nur-x-nachkommastellen-von-float.html)

Michael II 8. Okt 2023 22:33

AW: Nur x Nachkommastellen von Float
 
Zitat:

Zitat von mmw (Beitrag 1527844)
Hallo,

als Korrektur zu #3, (mit DOUBLE gab's Probleme)

Delphi-Quellcode:
function GetDigits(const AValue: Extended; Digits: Integer): Integer;

var
    value:Extended;
    value1:Real;

begin
   value:=frac(AValue)*intpower(10,digits);
   value1:=value;
   Result := trunc(value1);
end;

Gruß

Hoi mmw,

das Problem bleibt. Wenn ein Dezimalbruch eine unendlich binäre Darstellung hat (also binär irgend ein periodischer Bruch ist), dann kannst du den dezimalen Wert binär mit den Formaten single, double, extended nicht genau abspeichern. Das System kann nur die nächstkleinere oder nächstgrössere (durch das Format (extended) vorgegebene) mögliche Zahl abspeichern. (siehe weiter oben)
In deinem Fall treten zum Beispiel zwischen 99.000001 und 99.999999 natürlich wiederum die "gleichen" 496 Probleme auf. U.a. wird für GetDigitsNeu( 99.101000, 3 ).ToString) 100 ausgegeben.
Dies geschieht auch, wenn du die von dir vorgeschlagene Konversion nach real (als double implementiert) weglässt und mit extended rechnest. Extended erlaubt dir lediglich eine grössere Stellengenauigkeit als double.

Michael II 10. Okt 2023 17:49

AW: Nur x Nachkommastellen von Float
 
Für extended kannst du das Epsilon so addieren:

Delphi-Quellcode:
function plusepsilone(e : extended):extended;
var h : System.TExtended80Rec absolute e;
begin
   h.Frac := h.Frac+1;
   Result := e;
end;
(Hinweis: Prüft nicht, ob h.frac maximal = 1111.....111 ist.)

Uwe Raabe 10. Okt 2023 18:00

AW: Nur x Nachkommastellen von Float
 
Das geht dann aber auch etwas schlanker:
Delphi-Quellcode:
uses
  System.Sysutils;

...

function plusepsilone(const e : extended):extended;
begin
   Result := e;
   Result.Frac := Result.Frac+1;
end;
Könnte man auch noch als
Delphi-Quellcode:
inline
deklarieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.
Seite 2 von 2     12   

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