Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit Trunc (https://www.delphipraxis.net/196055-probleme-mit-trunc.html)

hhcm 19. Apr 2018 10:34

Probleme mit Trunc
 
Hallo zusammen,

kann mir mal jemand auf die Sprünge helfen?

Delphi-Quellcode:
var
    c: Int64;
    a,b: Double;
begin
  a := 1.71;
  c := Trunc(a*100); // C=170

  a := 1.71;
  b := a*100;
  c := Trunc(b); // C=171
Warum ist der erste versuch falsch?

gammatester 19. Apr 2018 10:52

AW: Probleme mit Trunc
 
Ich vermute, daß Du mit der 32-Bit-Version rechnest.

Dann ist das erste Ergebnis verständlich, da a*100 als Extended gerechnet wird: Das Zwischenresultat 170.999999999999996 wird dann auf 170 abgeschnitten.

Unter 64-Bit ist das Zwischenresultat 171.000000000000000.

Im Deinem zweiten Fall wird das Zwischenresultat erst nach Double gerundet und in b gespeichet (hat also wie bei 64-Bit den Wert 171.0)

OLDIE1950 19. Apr 2018 11:10

AW: Probleme mit Trunc
 
In Delphi konvertiert Trunc eine Gleitkommazahl in einen Integer-Wert.
X ist ein Ausdruck des Typs Real.
Trunc gibt einen Int64-Wert mit dem gegen 0 gerundeten Wert von X zurück.
http://docwiki.embarcadero.com/Libra...e/System.Trunc

gammatester 19. Apr 2018 11:17

AW: Probleme mit Trunc
 
Zitat:

Zitat von OLDIE1950 (Beitrag 1399820)
In Delphi konvertiert Trunc eine Gleitkommazahl in einen Integer-Wert.
X ist ein Ausdruck des Typs Real.

Das erklärt das Problem nicht! Das Wesentliche ist, daß X extended ist bei trunc(a*100).

hhcm 19. Apr 2018 11:17

AW: Probleme mit Trunc
 
Ok, das hab ich soweit verstanden.
Trotzdem stehe ich jetzt noch dümmer da als vorher :)
Heute ist einfach nicht mein Tag.

Ich möchte eigentlich nur einen Eurowert in Cent umrechnen und das möglichst ohne Rundungsfehler :roll:
Tatsächlich wird mit 32Bit kompiliert.

gammatester 19. Apr 2018 11:31

AW: Probleme mit Trunc
 
Dann rechne komplett 64-Bit-Integer oder mit Currency (<- dazu kann ich Dir aber nicht mehr sagen, siehe zB http://docwiki.embarcadero.com/Libra...ystem.Currency oder https://stackoverflow.com/questions/...ing-a-currency).

Oder wenn Du manuell wie oben mit 100 multiplizierst, sollte auch round statt trunc weiterhelfen.

hhcm 19. Apr 2018 11:39

AW: Probleme mit Trunc
 
Ich bekomme durchgezogen durch die ganze Anwendung ein Double mit dem Wert.
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?

Zacherl 19. Apr 2018 11:56

AW: Probleme mit Trunc
 
Zitat:

Zitat von hhcm (Beitrag 1399825)
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?

Ich behaupte, das ist sogar eher, was du willst (round). Statt abzuschneiden wird hier an den näheren Wert gerundet. Also praktisch kaufmännisches Runden, wie man es aus der Schule kennt
Delphi-Quellcode:
< 0.5 -> Abrunden
,
Delphi-Quellcode:
> 0.5 -> Aufrunden
.

gammatester 19. Apr 2018 11:58

AW: Probleme mit Trunc
 
Zitat:

Zitat von hhcm (Beitrag 1399825)
Ich bekomme durchgezogen durch die ganze Anwendung ein Double mit dem Wert.
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?

Mit Deinem Code hast Du dann für andere Werte die Probleme, zB für a=1.13.

Mit round sollte es funktionieren.

bcvs 19. Apr 2018 12:02

AW: Probleme mit Trunc
 
Zitat:

Zitat von hhcm (Beitrag 1399822)
Ich möchte eigentlich nur einen Eurowert in Cent umrechnen und das möglichst ohne Rundungsfehler

Dann nimm doch einfach Round statt Trunc. Dann sollte auch
Delphi-Quellcode:
Round(a*100)
funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 Uhr.
Seite 1 von 4  1 23     Letzte »    

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